diff --git a/lib/socPredef.ml b/lib/socPredef.ml index d4848811cef35cfbfcd47c05225e7c0a345e7a46..390d67bb7ffc16d007dd4dc6f80807c1633baa37 100644 --- a/lib/socPredef.ml +++ b/lib/socPredef.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/06/2020 (at 16:27) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/05/2022 (at 23:31) by Erwan Jahier> *) (** Synchronous Object Code for Predefined operators. *) @@ -129,145 +129,147 @@ let of_soc_key : Lxm.t -> Soc.key -> Soc.t = let sp_nary = soc_profile_of_types_nary in match id with | "Lustre::ruminus" - | "Lustre::iuminus" - | "Lustre::uminus" -> (make_soc sk (sp tl) [step11 lxm id]) - | "Lustre::not" -> (make_soc sk (sp tl) [step11 lxm id]) - | "Lustre::real2int" -> (make_soc sk (sp tl) [step11 lxm id]) - | "Lustre::int2real" -> (make_soc sk (sp tl) [step11 lxm id]) - - | "Lustre::mod" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::iuminus" + | "Lustre::uminus" + | "Lustre::not" + | "Lustre::real2int" + | "Lustre::int2real" + | "Lustre::random_int" + -> (make_soc sk (sp tl) [step11 lxm id]) + + | "Lustre::mod" | "Lustre::iplus" - | "Lustre::rplus" - | "Lustre::plus" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::rplus" + | "Lustre::plus" | "Lustre::times" - | "Lustre::itimes" - | "Lustre::rtimes" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::itimes" + | "Lustre::rtimes" | "Lustre::slash" - | "Lustre::islash" - | "Lustre::rslash" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::islash" + | "Lustre::rslash" | "Lustre::div" - | "Lustre::idiv" - | "Lustre::rdiv" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::idiv" + | "Lustre::rdiv" | "Lustre::minus" - | "Lustre::iminus" - | "Lustre::rminus" -> (make_soc sk (sp tl) [step21 lxm None id]) - - | "Lustre::lt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::gt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::lte" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::gte" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::ilt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::igt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::ilte" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::igte" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::rlt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::rgt" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::rlte" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::rgte" -> (make_soc sk (sp tl) [step21 lxm None id]) - - | "Lustre::and" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::eq" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::neq" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::or" -> (make_soc sk (sp tl) [step21 lxm None id]) - | "Lustre::xor" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::iminus" + | "Lustre::rminus" + + | "Lustre::lt" + | "Lustre::gt" + | "Lustre::lte" + | "Lustre::gte" + | "Lustre::ilt" + | "Lustre::igt" + | "Lustre::ilte" + | "Lustre::igte" + | "Lustre::rlt" + | "Lustre::rgt" + | "Lustre::rlte" + | "Lustre::rgte" + + | "Lustre::and" + | "Lustre::eq" + | "Lustre::neq" + | "Lustre::or" + | "Lustre::xor" | "Lustre::impl" -> (make_soc sk (sp tl) [step21 lxm None id]) - + (* Those have instances *) | "Lustre::current" -> ( - match sk with - | _,tl, Curr(cc) -> ( - assert(tl<>[]); - let t = List.hd (List.tl tl) in - let mem:var = (get_mem_name sk t, t) in - let prof:var list * var list = sp tl in - let cv,vin,vout = - match prof with ([cv;vin],[vout]) -> cv,vin,vout | _ -> assert false - in - { - key = sk; - profile = (sp tl); - clock_profile = []; - instances = []; - memory = Mem (t); - step = [ - { - name = "step"; - lxm = lxm; - idx_ins = [0;1]; - idx_outs = [0]; - impl = - Gaol([], - [Case((fst cv),[ - (Lv6Id.string_of_long false cc, [Call([Var(mem)], - Assign, [Var(vin)], - lxm)])], - lxm); - Call([Var(vout)], Assign, [Var(mem)], lxm )]) - }; - ]; - precedences = []; - assertions = []; - } + match sk with + | _,tl, Curr(cc) -> ( + assert(tl<>[]); + let t = List.hd (List.tl tl) in + let mem:var = (get_mem_name sk t, t) in + let prof:var list * var list = sp tl in + let cv,vin,vout = + match prof with ([cv;vin],[vout]) -> cv,vin,vout | _ -> assert false + in + { + key = sk; + profile = (sp tl); + clock_profile = []; + instances = []; + memory = Mem (t); + step = [ + { + name = "step"; + lxm = lxm; + idx_ins = [0;1]; + idx_outs = [0]; + impl = + Gaol([], + [Case((fst cv),[ + (Lv6Id.string_of_long false cc, [Call([Var(mem)], + Assign, [Var(vin)], + lxm)])], + lxm); + Call([Var(vout)], Assign, [Var(mem)], lxm )]) + }; + ]; + precedences = []; + assertions = []; + } + ) + | _,_tl, Nomore -> (* current is applied to something on the base clock *) + raise (Lv6errors.Compile_error(lxm, "current applied on the base clock")) + | _,_, _ -> assert false ) - | _,_tl, Nomore -> (* current is applied to something on the base clock *) - raise (Lv6errors.Compile_error(lxm, "current applied on the base clock")) - | _,_, _ -> assert false - ) | "Lustre::pre" -> - let _,tl,_ = sk in - let t = List.hd tl in - let pre_mem:var = (get_mem_name sk t, t) in - let prof = sp tl in - let v1,vout = match prof with ([v1],[vout]) -> v1,vout | _ -> assert false in - { - key = sk; - profile = (sp tl); - clock_profile = []; - instances = []; - memory = Mem (t); (* so that pre_mem exist *) - step = [ - { - name = "get"; - lxm = lxm; - idx_ins = []; - idx_outs = [0]; - (* impl = Predef; *) - impl = Gaol([],[Call([Var(vout)], Assign, [Var(pre_mem)], lxm)]); - (*impl = Gaol([pre_mem],[Call([Var(vout)], Assign, [Var(pre_mem)])]); *) - }; - { - name = "set"; - lxm = lxm; - idx_ins = [0]; - idx_outs = []; - (* impl = Predef; *) - impl = Gaol([],[Call([Var(pre_mem)], Assign, [Var(v1)], lxm )]); - (* impl = Gaol([pre_mem],[Call([Var(pre_mem)], Assign, [Var(v1)])]); *) - }; - ]; - precedences = ["set", ["get"]]; - assertions = []; - } + let _,tl,_ = sk in + let t = List.hd tl in + let pre_mem:var = (get_mem_name sk t, t) in + let prof = sp tl in + let v1,vout = match prof with ([v1],[vout]) -> v1,vout | _ -> assert false in + { + key = sk; + profile = (sp tl); + clock_profile = []; + instances = []; + memory = Mem (t); (* so that pre_mem exist *) + step = [ + { + name = "get"; + lxm = lxm; + idx_ins = []; + idx_outs = [0]; + (* impl = Predef; *) + impl = Gaol([],[Call([Var(vout)], Assign, [Var(pre_mem)], lxm)]); + (*impl = Gaol([pre_mem],[Call([Var(vout)], Assign, [Var(pre_mem)])]); *) + }; + { + name = "set"; + lxm = lxm; + idx_ins = [0]; + idx_outs = []; + (* impl = Predef; *) + impl = Gaol([],[Call([Var(pre_mem)], Assign, [Var(v1)], lxm )]); + (* impl = Gaol([pre_mem],[Call([Var(pre_mem)], Assign, [Var(v1)])]); *) + }; + ]; + precedences = ["set", ["get"]]; + assertions = []; + } | "Lustre::arrow" -> - let prof = sp tl in - { - key = sk; - profile = prof; - clock_profile = []; - instances = []; - step = [ - { - name = "step"; - lxm = lxm; - idx_ins = [0;1]; - idx_outs = [0]; - impl = Predef; - } - ]; - precedences = []; - assertions = []; - memory = Mem Bool; - } + let prof = sp tl in + { + key = sk; + profile = prof; + clock_profile = []; + instances = []; + step = [ + { + name = "step"; + lxm = lxm; + idx_ins = [0;1]; + idx_outs = [0]; + impl = Predef; + } + ]; + precedences = []; + assertions = []; + memory = Mem Bool; + } | "Lustre::if" -> { key = sk; profile = (sp tl); @@ -278,70 +280,70 @@ let of_soc_key : Lxm.t -> Soc.key -> Soc.t = assertions = []; memory = No_mem; step = [ - { - name = "step"; - lxm = lxm; - idx_ins = [0; 1; 2]; - idx_outs = [0]; - impl = Predef; + { + name = "step"; + lxm = lxm; + idx_ins = [0; 1; 2]; + idx_outs = [0]; + impl = Predef; } ]; } | "Lustre::nor" -> - let size = match sk with - | _,[Array(Bool,size);_],_ -> size - | _,bools,_ -> - if List.exists (fun t -> t<>Bool) bools then - failwith "type error in nor" - else - List.length bools - in - { - Soc.key = sk; - Soc.profile = sp_nary tl; - Soc.clock_profile = []; - Soc.instances = [] ; - Soc.step = [ - { - name = "step"; - lxm = lxm; - idx_ins = [0]; - idx_outs = [0]; - impl = Boolred(0, 0, size); - } - ]; - Soc.memory = No_mem; - Soc.precedences = []; - Soc.assertions = []; - } + let size = match sk with + | _,[Array(Bool,size);_],_ -> size + | _,bools,_ -> + if List.exists (fun t -> t<>Bool) bools then + failwith "type error in nor" + else + List.length bools + in + { + Soc.key = sk; + Soc.profile = sp_nary tl; + Soc.clock_profile = []; + Soc.instances = [] ; + Soc.step = [ + { + name = "step"; + lxm = lxm; + idx_ins = [0]; + idx_outs = [0]; + impl = Boolred(0, 0, size); + } + ]; + Soc.memory = No_mem; + Soc.precedences = []; + Soc.assertions = []; + } | "Lustre::diese" -> - let size = match sk with - | _,[Array(Bool,size);_],_ -> size - | _,bools,_ -> - if List.exists (fun t -> t<>Bool) bools then - failwith "type error in #" - else - List.length bools - in - { - Soc.key = sk; - Soc.profile = sp_nary tl; - Soc.clock_profile = []; - Soc.instances = [] ; - Soc.step = [ - { - name = "step"; - lxm = lxm; - idx_ins = [0]; - idx_outs = [0]; - impl = Boolred(0,1, size); - } - ]; - Soc.memory = No_mem; - Soc.precedences = []; - Soc.assertions = []; - } + let size = match sk with + | _,[Array(Bool,size);_],_ -> size + | _,bools,_ -> + if List.exists (fun t -> t<>Bool) bools then + failwith "type error in #" + else + List.length bools + in + { + Soc.key = sk; + Soc.profile = sp_nary tl; + Soc.clock_profile = []; + Soc.instances = [] ; + Soc.step = [ + { + name = "step"; + lxm = lxm; + idx_ins = [0]; + idx_outs = [0]; + impl = Boolred(0,1, size); + } + ]; + Soc.memory = No_mem; + Soc.precedences = []; + Soc.assertions = []; + } | _ -> - failwith ("*** The soc of "^id ^ " is not defined! \n") + failwith ("*** The soc of "^id ^ " is not defined! \n") @@ -514,8 +516,11 @@ let output_type_of_op op tl = | "Lustre::nor" | "Lustre::diese" -> Bool - | "Lustre::real2int" -> Int - | "Lustre::int2real" -> Real + | "Lustre::real2int" + | "Lustre::random_int" + -> Int + | "Lustre::int2real" + -> Real | "Lustre::if" -> assert(tl<>[]);List.hd (List.tl tl) | "Lustre::hat" -> assert false (* sno? *) | "Lustre::array" -> assert false (* sno? *) diff --git a/lib/socPredef2cStack.ml b/lib/socPredef2cStack.ml index 9aa506c9f6eb1c238392747a8e27741c808446f0..d1970f240967f80c4a88ba4743f6580200a6a228 100644 --- a/lib/socPredef2cStack.ml +++ b/lib/socPredef2cStack.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 15/03/2021 (at 18:06) by Erwan Jahier> *) +(* Time-stamp: <modified the 17/05/2022 (at 23:35) by Erwan Jahier> *) open Data open Soc @@ -185,6 +185,8 @@ let (get_predef_op: Soc.key -> string) = | "Lustre::not" -> lustre_unop sk "!" | "Lustre::real2int" -> lustre_unop sk "(_integer)" | "Lustre::int2real" -> lustre_unop sk "(_real)" + + | "Lustre::random_int" -> lustre_unop sk "rand() % " | "Lustre::lt" | "Lustre::rlt" diff --git a/test/lus2lic.sum b/test/lus2lic.sum index ce6f5e4d1a96985811612bbc6496422031397417..954e3f8dab3bc7d625c8a7ef98a2ddef915c0e41 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,5 +1,5 @@ ==> lus2lic0.sum <== -Test run by jahier on Thu May 12 10:47:08 +Test run by jahier on Wed Jun 15 15:01:24 Native configuration is x86_64-pc-linux-gnu === lus2lic0 tests === @@ -66,7 +66,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 Thu May 12 10:47:09 +Test run by jahier on Wed Jun 15 15:01:25 Native configuration is x86_64-pc-linux-gnu === lus2lic1 tests === @@ -626,7 +626,7 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus {} PASS: /home/jahier/lus2lic/test/../utils/compare_lv6_and_lv6_en multipar.lus {} ==> lus2lic2.sum <== -Test run by jahier on Thu May 12 10:51:44 +Test run by jahier on Wed Jun 15 15:07:17 Native configuration is x86_64-pc-linux-gnu === lus2lic2 tests === @@ -1171,7 +1171,7 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_lv6_and_lv6_en zzz2.lus {} PASS: /home/jahier/lus2lic/test/../utils/compare_gcc_and_clang zzz2.lus {} ==> lus2lic3.sum <== -Test run by jahier on Thu May 12 10:56:36 +Test run by jahier on Wed Jun 15 15:13:46 Native configuration is x86_64-pc-linux-gnu === lus2lic3 tests === @@ -1686,7 +1686,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {} ==> lus2lic4.sum <== -Test run by jahier on Thu May 12 10:58:05 +Test run by jahier on Wed Jun 15 15:14:57 Native configuration is x86_64-pc-linux-gnu === lus2lic4 tests === @@ -2211,11 +2211,11 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_gcc_and_clang multipar.lus {} =============================== # Total number of failures: 17 lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 274 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 292 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 89 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 43 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 352 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 389 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 71 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 89 seconds * Ref time: -234.87user 64.78system 11:39.53elapsed 42%CPU (0avgtext+0avgdata 73968maxresident)k -7627992inputs+462696outputs (22736major+19473366minor)pagefaults 0swaps +323.65user 78.07system 15:01.63elapsed 44%CPU (0avgtext+0avgdata 77252maxresident)k +143424inputs+458920outputs (454major+19444018minor)pagefaults 0swaps * Quick time (-j 4):