From 50197035822142c871f65b41f584fde225359e4f Mon Sep 17 00:00:00 2001 From: Erwan Jahier <jahier@imag.fr> Date: Fri, 6 Jan 2017 10:40:03 +0100 Subject: [PATCH] Returns a message (instead of assert false) when an extern node is used from the interpreters. also: -2cw7: fix the generated script arduino dir: minor fixes --- _oasis | 2 +- arduino/led_puzlle/arduino_puzzle1.lus | 2 +- arduino/led_puzlle/arduino_puzzle2.lus | 2 +- arduino/led_puzlle/arduino_puzzle3.lus | 2 +- arduino/led_puzlle/arduino_puzzle4.lus | 2 +- arduino/led_puzlle/arduino_puzzle5.lus | 2 +- arduino/led_puzlle/arduino_puzzle6.lus | 2 +- arduino/led_puzlle/led.lus | 7 +- lv6-ref-man/lv6-ref-man.tex | 18 +- src/lv6version.ml | 4 +- src/soc2c.ml | 4 +- src/socExec.ml | 267 +++++++++++++------------ src/socExecDbg.ml | 9 +- test/lus2lic.sum | 26 +-- 14 files changed, 178 insertions(+), 171 deletions(-) diff --git a/_oasis b/_oasis index 7ec67509..de764e3c 100644 --- a/_oasis +++ b/_oasis @@ -1,6 +1,6 @@ OASISFormat: 0.4 Name: lustre-v6 -Version: 1.676 +Version: 1.677 Synopsis: The Lustre V6 Verimag compiler Description: This package contains: (1) lus2lic: the (current) name of the compiler (and interpreter via -exec). diff --git a/arduino/led_puzlle/arduino_puzzle1.lus b/arduino/led_puzlle/arduino_puzzle1.lus index 7d8c0d95..579fbe14 100644 --- a/arduino/led_puzlle/arduino_puzzle1.lus +++ b/arduino/led_puzlle/arduino_puzzle1.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle1(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle1(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/arduino_puzzle2.lus b/arduino/led_puzlle/arduino_puzzle2.lus index b02e9281..70c232a8 100644 --- a/arduino/led_puzlle/arduino_puzzle2.lus +++ b/arduino/led_puzlle/arduino_puzzle2.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle2(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle2(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/arduino_puzzle3.lus b/arduino/led_puzlle/arduino_puzzle3.lus index ae1664d7..f7429d22 100644 --- a/arduino/led_puzlle/arduino_puzzle3.lus +++ b/arduino/led_puzlle/arduino_puzzle3.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle3(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle3(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/arduino_puzzle4.lus b/arduino/led_puzlle/arduino_puzzle4.lus index 131d1684..f604a54a 100644 --- a/arduino/led_puzlle/arduino_puzzle4.lus +++ b/arduino/led_puzlle/arduino_puzzle4.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle4(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle4(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/arduino_puzzle5.lus b/arduino/led_puzlle/arduino_puzzle5.lus index 8a74c654..b7bd3e2b 100644 --- a/arduino/led_puzlle/arduino_puzzle5.lus +++ b/arduino/led_puzlle/arduino_puzzle5.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle5(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle5(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/arduino_puzzle6.lus b/arduino/led_puzlle/arduino_puzzle6.lus index 51e89416..eebf8c87 100644 --- a/arduino/led_puzlle/arduino_puzzle6.lus +++ b/arduino/led_puzlle/arduino_puzzle6.lus @@ -1,4 +1,4 @@ node arduino_puzzle(red,blue:bool) returns (led1,led2,led3,led4,led5:bool); let - led1,led2,led3,led4,led5=puzzle6(pulse(red), pulse(blue)); + led1,led2,led3,led4,led5=puzzle6(edge(red), edge(blue)); tel diff --git a/arduino/led_puzlle/led.lus b/arduino/led_puzlle/led.lus index 710f1cb1..2093055e 100644 --- a/arduino/led_puzlle/led.lus +++ b/arduino/led_puzlle/led.lus @@ -198,12 +198,9 @@ node puzzle5_has_no_solution = puzzle_has_no_solution <<puzzle5>> node puzzle6_has_no_solution = puzzle_has_no_solution <<puzzle6>> -node pulse(s:bool) returns (res:bool); -var - pressed:bool; +node edge(s:bool) returns (res:bool); let - pressed = false -> s; - res=pre(pressed) and not(s); + res= false -> not pre(s) and s; tel diff --git a/lv6-ref-man/lv6-ref-man.tex b/lv6-ref-man/lv6-ref-man.tex index 670b422c..90489532 100644 --- a/lv6-ref-man/lv6-ref-man.tex +++ b/lv6-ref-man/lv6-ref-man.tex @@ -1171,9 +1171,10 @@ external items are effectively launched from a Lustre program depends on the back-ends of the compiler. -\begin{example}[] -\input{complex.lus} -\end{example} +%\begin{example}[] +%\input{} +%\end{example} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1182,12 +1183,6 @@ on the back-ends of the compiler. A Lustre-core program is a set of constant, types, function and node Declarations. - - - - - - \cleardoublepage @@ -1827,6 +1822,11 @@ functions. \end{alltt} \end{example} +\begin{example}[] +\input{complex.lus} +\end{example} + + % \kwd{node} foo( a : a_user_type) \kwd{returns} (x, y: real); % \kwd{const} n : int; % \kwd{type} a_user_type; diff --git a/src/lv6version.ml b/src/lv6version.ml index edbaa0dd..e70b02ba 100644 --- a/src/lv6version.ml +++ b/src/lv6version.ml @@ -1,7 +1,7 @@ (** Automatically generated from Makefile *) let tool = "lus2lic" let branch = "master" -let commit = "676" -let sha_1 = "24a93acc1d2d2d2815902aa67acf26a0a0795c65" +let commit = "677" +let sha_1 = "85c5034f2b9a788cc1ab75c18815caae7bdb7d5c" let str = (branch ^ "." ^ commit ^ " (" ^ sha_1 ^ ")") let maintainer = "jahier@imag.fr" diff --git a/src/soc2c.ml b/src/soc2c.ml index 754f1ef1..18fb422c 100644 --- a/src/soc2c.ml +++ b/src/soc2c.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 22/12/2016 (at 16:14) by jahier> *) +(* Time-stamp: <modified the 06/01/2017 (at 10:24) by Erwan Jahier> *) (* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *) @@ -1022,7 +1022,7 @@ fixffx $ARM_LOOPLOC -i $n_n.ff > $n_n.fixed.ffx # Let's run otawa (owcet.arm)\n" ^ "$OTAWA $execfile $main_step -f $n_n.fixed.ffx -f $n_n.ffx --add-prop otawa::ilp::OUTPUT_PATH=$main_step.lp \\\n\t>"^ "$n_n.owcet.arm.log 2>&1 && \n"^ - "grep WCET $n_n.owcet.arm.log | cut -d \" \" -f 3 > "^ + "grep WCET $n_n.owcet.arm.log | cut -d \"=\" -f 2 > "^ "$n.wcet &&\n\n" ^ "WCET=`cat $n.wcet` \n\n" ^ "# Let's compile the c files for ogensim \n" ^ diff --git a/src/socExec.ml b/src/socExec.ml index 35af586f..d3a35026 100644 --- a/src/socExec.ml +++ b/src/socExec.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 30/11/2016 (at 17:10) by Erwan Jahier> *) +(* Time-stamp: <modified the 02/01/2017 (at 18:11) by Erwan Jahier> *) open Soc open Data @@ -32,152 +32,157 @@ let (array_index : int -> var -> var_expr) = let rec (soc_step : Soc.step_method -> Soc.tbl -> Soc.t -> SocExecValue.ctx -> SocExecValue.ctx) = fun step soc_tbl soc ctx -> - profile_info ("SocExec.soc_step \n"); + profile_info ("SocExec.soc_step \n"); let soc_name,_,_ = soc.key in let ctx = match step.impl with - | Extern -> assert false (* fixme !!! *) - | Predef -> ( - try - let ctx = SocExecEvalPredef.get soc.key ctx in - ctx - with Not_found -> (* Not a predef op *) print_string ( - "*** internal error in "^soc_name^". Is it defined in SocExecEvalPredef?\n"); - flush stdout; assert false - ) - | Gaol(vl,gaol) -> List.fold_left (do_gao step.lxm soc_tbl) ctx gaol - | Boolred(i,j,k) -> ( - (* XXX mettre ce code dans socPredef ? (ou socMetaopPredef)*) - let inputs, outputs = soc.profile in - let b_array = (List.hd inputs) in - let cpt = ref 0 in - for i = 0 to k-1 do - let a_i = array_index i b_array in - let v = SocExecValue.get_value ctx a_i in - if v = B true then incr cpt; - done; - let res = B (!cpt >= i && !cpt <= j) in - let res_var = fst (List.hd outputs) in - let s = sadd ctx.s (res_var::ctx.cpath) res in - { ctx with s = s } - ) - | Condact(node_sk, dft_cst) -> ( - let clk = SocExecValue.get_value ctx (Var ("activate",Bool)) in - let vel_in, vel_out = soc.profile in - let vel_in = List.map (fun x -> Var x) (List.tl vel_in) in - let vel_out = List.map (fun x -> Var x) vel_out in - let node_soc = SocUtils.find step.lxm node_sk soc_tbl in - let inst_name = - match soc.instances with - | [] -> let (proc_name,_,_) = node_soc.key in proc_name - | [inst] -> fst inst + | Extern -> + print_string ( + "\nextern nodes and functions not yet supported in the interpreter, sorry.\n"^ + "Please use the C code generator (-2c)." + ); + exit 2 + | Predef -> ( + try + let ctx = SocExecEvalPredef.get soc.key ctx in + ctx + with Not_found -> (* Not a predef op *) print_string ( + "*** internal error in "^soc_name^". Is it defined in SocExecEvalPredef?\n"); + flush stdout; assert false + ) + | Gaol(vl,gaol) -> List.fold_left (do_gao step.lxm soc_tbl) ctx gaol + | Boolred(i,j,k) -> ( + (* XXX mettre ce code dans socPredef ? (ou socMetaopPredef)*) + let inputs, outputs = soc.profile in + let b_array = (List.hd inputs) in + let cpt = ref 0 in + for i = 0 to k-1 do + let a_i = array_index i b_array in + let v = SocExecValue.get_value ctx a_i in + if v = B true then incr cpt; + done; + let res = B (!cpt >= i && !cpt <= j) in + let res_var = fst (List.hd outputs) in + let s = sadd ctx.s (res_var::ctx.cpath) res in + { ctx with s = s } + ) + | Condact(node_sk, dft_cst) -> ( + let clk = SocExecValue.get_value ctx (Var ("activate",Bool)) in + let vel_in, vel_out = soc.profile in + let vel_in = List.map (fun x -> Var x) (List.tl vel_in) in + let vel_out = List.map (fun x -> Var x) vel_out in + let node_soc = SocUtils.find step.lxm node_sk soc_tbl in + let inst_name = + match soc.instances with + | [] -> let (proc_name,_,_) = node_soc.key in proc_name + | [inst] -> fst inst + | _ -> assert false + in + let path_saved = ctx.cpath in + let ctx = { ctx with cpath=inst_name::ctx.cpath } in + let ctx = + if clk = B true then + let node_step = match node_soc.step with + [step] -> step | _ -> assert false - in - let path_saved = ctx.cpath in - let ctx = { ctx with cpath=inst_name::ctx.cpath } in - let ctx = - if clk = B true then - let node_step = match node_soc.step with - [step] -> step - | _ -> assert false - in - let ctx = do_step inst_name node_step ctx soc_tbl node_soc vel_in vel_out in - { ctx with cpath=path_saved } + in + let ctx = do_step inst_name node_step ctx soc_tbl node_soc vel_in vel_out in + { ctx with cpath=path_saved } + else + let first_step = Var ("_memory",Bool) in + let ctx = { ctx with cpath=path_saved } in + let v = get_value ctx first_step in + if v = U || v = B true then + (* We are on the first step of node_soc; + - we assign the output var to the default values *) + (assert (List.length dft_cst = List.length vel_out); + List.fold_left2 assign_expr ctx dft_cst vel_out) else - let first_step = Var ("_memory",Bool) in - let ctx = { ctx with cpath=path_saved } in - let v = get_value ctx first_step in - if v = U || v = B true then - (* We are on the first step of node_soc; - - we assign the output var to the default values *) - (assert (List.length dft_cst = List.length vel_out); - List.fold_left2 assign_expr ctx dft_cst vel_out) - else - (* We are not on the first step of node_soc; hence we do nothing - and the output will keep their previous value. *) - ctx - in - let ctx = { ctx with s = sadd ctx.s ("_memory"::ctx.cpath) (B false) } in - ctx - ) - | Iterator(iter, node_sk, n) -> - let node_soc = SocUtils.find step.lxm node_sk soc_tbl in - let node_step = match node_soc.step with [step] -> step | _ -> assert false in - let iter_inputs,iter_outputs = soc.profile in - let rctx = ref ctx in - let (proc_name,_,_) = node_soc.key in - let inst_name = - match soc.instances with - | [] -> Array.make n proc_name - | _ -> Array.of_list (List.map fst soc.instances) + (* We are not on the first step of node_soc; hence we do nothing + and the output will keep their previous value. *) + ctx + in + let ctx = { ctx with s = sadd ctx.s ("_memory"::ctx.cpath) (B false) } in + ctx + ) + | Iterator(iter, node_sk, n) -> + let node_soc = SocUtils.find step.lxm node_sk soc_tbl in + let node_step = match node_soc.step with [step] -> step | _ -> assert false in + let iter_inputs,iter_outputs = soc.profile in + let rctx = ref ctx in + let (proc_name,_,_) = node_soc.key in + let inst_name = + match soc.instances with + | [] -> Array.make n proc_name + | _ -> Array.of_list (List.map fst soc.instances) + in + for i = 0 to n-1 do + rctx := { !rctx with cpath = inst_name.(i)::ctx.cpath }; + let vel_in, vel_out = + match iter with + | "map" -> (List.map (array_index i) iter_inputs, + List.map (array_index i) iter_outputs) + | "fold" | "red" | "fill" | "fillred" -> + let a_in = Var (List.hd iter_inputs) in + ( a_in::(List.map (array_index i) (List.tl iter_inputs)), + a_in::(List.map (array_index i) (List.tl iter_outputs))) + | _ -> assert false (* should not occur *) in - for i = 0 to n-1 do - rctx := { !rctx with cpath = inst_name.(i)::ctx.cpath }; - let vel_in, vel_out = - match iter with - | "map" -> (List.map (array_index i) iter_inputs, - List.map (array_index i) iter_outputs) - | "fold" | "red" | "fill" | "fillred" -> - let a_in = Var (List.hd iter_inputs) in - ( a_in::(List.map (array_index i) (List.tl iter_inputs)), - a_in::(List.map (array_index i) (List.tl iter_outputs))) - | _ -> assert false (* should not occur *) - in - rctx := do_step inst_name.(i) node_step !rctx soc_tbl node_soc vel_in vel_out; - rctx := { !rctx with cpath = List.tl !rctx.cpath }; - done; - if iter <> "map" then ( - let a_in = Var (List.hd iter_inputs) in - let a_out = Var (List.hd iter_outputs) in - rctx := assign_expr !rctx a_in a_out); (* a_out=a_n *) - !rctx; + rctx := do_step inst_name.(i) node_step !rctx soc_tbl node_soc vel_in vel_out; + rctx := { !rctx with cpath = List.tl !rctx.cpath }; + done; + if iter <> "map" then ( + let a_in = Var (List.hd iter_inputs) in + let a_out = Var (List.hd iter_outputs) in + rctx := assign_expr !rctx a_in a_out); (* a_out=a_n *) + !rctx; in ctx and (do_gao : Lxm.t -> Soc.tbl -> SocExecValue.ctx -> gao -> SocExecValue.ctx) = fun lxm soc_tbl ctx gao -> match gao with - | Case(id, id_gao_l,lxm) -> ( - try - let id_val = get_enum id ctx in - let gaol = List.assoc id_val id_gao_l in - let ctx = List.fold_left (do_gao lxm soc_tbl) ctx gaol in - ctx - with Not_found -> ctx - ) - | Call(vel_out, Assign, vel_in,lxm) -> ( - let ctx = - assert (List.length vel_in = List.length vel_out); - List.fold_left2 assign_expr ctx vel_in vel_out - in + | Case(id, id_gao_l,lxm) -> ( + try + let id_val = get_enum id ctx in + let gaol = List.assoc id_val id_gao_l in + let ctx = List.fold_left (do_gao lxm soc_tbl) ctx gaol in ctx - ) - | Call(vel_out, Procedure sk, vel_in,lxm) -> ( - let (proc_name,_,_) = sk in - let path_saved = ctx.cpath in - let ctx = { ctx with cpath = proc_name::ctx.cpath } in - let soc = SocUtils.find lxm sk soc_tbl in - let step = match soc.step with [step] -> step | _ -> assert false in - let ctx = do_step proc_name step ctx soc_tbl soc vel_in vel_out in - { ctx with - cpath = path_saved - } - ) - | Call(vel_out, Method((inst_name,sk),step_name), vel_in,lxm) -> ( - let path_saved = ctx.cpath in - let ctx = { ctx with cpath = inst_name::ctx.cpath } in - let soc = SocUtils.find lxm sk soc_tbl in - let step = try List.find (fun sm -> sm.name = step_name) soc.step - with Not_found -> assert false - in - let ctx = do_step inst_name step ctx soc_tbl soc vel_in vel_out in - let ctx = { ctx with cpath = path_saved } in - ctx - ) + with Not_found -> ctx + ) + | Call(vel_out, Assign, vel_in,lxm) -> ( + let ctx = + assert (List.length vel_in = List.length vel_out); + List.fold_left2 assign_expr ctx vel_in vel_out + in + ctx + ) + | Call(vel_out, Procedure sk, vel_in,lxm) -> ( + let (proc_name,_,_) = sk in + let path_saved = ctx.cpath in + let ctx = { ctx with cpath = proc_name::ctx.cpath } in + let soc = SocUtils.find lxm sk soc_tbl in + let step = match soc.step with [step] -> step | _ -> assert false in + let ctx = do_step proc_name step ctx soc_tbl soc vel_in vel_out in + { ctx with + cpath = path_saved + } + ) + | Call(vel_out, Method((inst_name,sk),step_name), vel_in,lxm) -> ( + let path_saved = ctx.cpath in + let ctx = { ctx with cpath = inst_name::ctx.cpath } in + let soc = SocUtils.find lxm sk soc_tbl in + let step = try List.find (fun sm -> sm.name = step_name) soc.step + with Not_found -> assert false + in + let ctx = do_step inst_name step ctx soc_tbl soc vel_in vel_out in + let ctx = { ctx with cpath = path_saved } in + ctx + ) and (do_step : Lv6Id.t -> step_method -> SocExecValue.ctx -> Soc.tbl -> Soc.t -> var_expr list -> var_expr list -> SocExecValue.ctx) = fun name step ctx soc_tbl soc vel_in vel_out -> - profile_info ("SocExec.do_step "^name^"\n"); + profile_info ("SocExec.do_step "^name^"\n"); let soc_in_vars, soc_out_vars = soc.profile in let step_in_vars = filter_params soc soc_in_vars step.idx_ins in let step_out_vars = filter_params soc soc_out_vars step.idx_outs in diff --git a/src/socExecDbg.ml b/src/socExecDbg.ml index 4ec3d588..268fb749 100644 --- a/src/socExecDbg.ml +++ b/src/socExecDbg.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 06/12/2016 (at 14:53) by jahier> *) +(* Time-stamp: <modified the 02/01/2017 (at 18:11) by Erwan Jahier> *) open Soc open Data open SocExecValue @@ -64,7 +64,12 @@ let rec (soc_step : Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t -> let soc_name,_,_ = soc.key in let event = match step.impl with - | Extern -> assert false (* fixme !!! *) + | Extern -> + print_string ( + "\nextern nodes and functions not yet supported in the interpreter, sorry.\n"^ + "Please use the C code generator (-2c)." + ); + exit 2 | Predef -> ( try let val_ctx = SocExecEvalPredef.get soc.key val_ctx in diff --git a/test/lus2lic.sum b/test/lus2lic.sum index 749ad985..3b50a23e 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,5 +1,5 @@ ==> lus2lic0.sum <== -Test Run By jahier on Mon Jan 2 15:47:50 +Test Run By jahier on Fri Jan 6 10:32:53 Native configuration is x86_64-unknown-linux-gnu === lus2lic0 tests === @@ -64,7 +64,7 @@ XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/lecte XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/s.lus ==> lus2lic1.sum <== -Test Run By jahier on Mon Jan 2 15:47:50 +Test Run By jahier on Fri Jan 6 10:32:54 Native configuration is x86_64-unknown-linux-gnu === lus2lic1 tests === @@ -399,7 +399,7 @@ PASS: sh multipar.sh PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus {} ==> lus2lic2.sum <== -Test Run By jahier on Mon Jan 2 15:48:09 +Test Run By jahier on Fri Jan 6 10:33:15 Native configuration is x86_64-unknown-linux-gnu === lus2lic2 tests === @@ -745,7 +745,7 @@ PASS: sh zzz2.sh PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz2.lus {} ==> lus2lic3.sum <== -Test Run By jahier on Mon Jan 2 15:48:48 +Test Run By jahier on Fri Jan 6 10:33:56 Native configuration is x86_64-unknown-linux-gnu === lus2lic3 tests === @@ -1251,7 +1251,7 @@ PASS: ./myec2c {-o multipar.c multipar.ec} PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {} ==> lus2lic4.sum <== -Test Run By jahier on Mon Jan 2 15:48:59 +Test Run By jahier on Fri Jan 6 10:34:06 Native configuration is x86_64-unknown-linux-gnu === lus2lic4 tests === @@ -1776,13 +1776,13 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node zzz2.lus {} =============================== # Total number of failures: 24 lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 0 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 19 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 38 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 11 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 30 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 20 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 40 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 10 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 31 seconds * Ref time: -0.05user 0.04system 1:39.74elapsed 0%CPU (0avgtext+0avgdata 5736maxresident)k -128inputs+0outputs (0major+6144minor)pagefaults 0swaps +0.06user 0.02system 1:44.06elapsed 0%CPU (0avgtext+0avgdata 5624maxresident)k +96inputs+0outputs (0major+6038minor)pagefaults 0swaps * Quick time (-j 4): -0.04user 0.04system 0:48.79elapsed 0%CPU (0avgtext+0avgdata 5648maxresident)k -96inputs+0outputs (0major+6161minor)pagefaults 0swaps +0.06user 0.02system 0:49.80elapsed 0%CPU (0avgtext+0avgdata 5716maxresident)k +96inputs+0outputs (0major+6055minor)pagefaults 0swaps -- GitLab