From 465c53c92be497dd4d8e1d53ad04b245d1c000f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9lio=20Brun?= <lb@leliobrun.net>
Date: Wed, 10 May 2023 01:12:47 +0900
Subject: [PATCH] start to ensure that top nodes and filenames coincide to ease
 analysis design a "mock" libgcc because OTAWA can get lost in the standard
 one

---
 lustrec_tests/lustre_files/SYNAPSE_1.lus    |   2 +-
 lustrec_tests/lustre_files/_6counter.lus    |   2 +-
 lustrec_tests/lustre_files/hysteresis_1.lus |   2 +-
 lustrec_tests/lustre_files/two_counters.lus |   2 +-
 lustrec_tests/wcet/dune                     |   1 +
 lustrec_tests/wcet/eabi_mock.c              |  35 +++++
 lustrec_tests/wcet/test.ml                  | 139 ++++++++++++--------
 7 files changed, 126 insertions(+), 57 deletions(-)
 create mode 100644 lustrec_tests/wcet/eabi_mock.c

diff --git a/lustrec_tests/lustre_files/SYNAPSE_1.lus b/lustrec_tests/lustre_files/SYNAPSE_1.lus
index 7bc737ff..beb5669f 100644
--- a/lustrec_tests/lustre_files/SYNAPSE_1.lus
+++ b/lustrec_tests/lustre_files/SYNAPSE_1.lus
@@ -42,7 +42,7 @@ let
 
 tel
 
-node top(e_s1, e_s2, e_s3 : bool; init_invalid_s : int)
+node SYNAPSE_1(e_s1, e_s2, e_s3 : bool; init_invalid_s : int)
 returns( OK : bool );
 --@ contract guarantee OK by 2-induction;
     var invalid_s, valid_s, dirty_s : int; mem_init_s : int;
diff --git a/lustrec_tests/lustre_files/_6counter.lus b/lustrec_tests/lustre_files/_6counter.lus
index 3eff24be..bf2c3824 100644
--- a/lustrec_tests/lustre_files/_6counter.lus
+++ b/lustrec_tests/lustre_files/_6counter.lus
@@ -1,7 +1,7 @@
 -- a simple 0 to 5 boolean counter (A is LSB, C is MSB)
 -- property is that it should never reach 6 or 7
 
-node top (x:bool) returns (OK:bool);
+node _6counter (x:bool) returns (OK:bool);
 --@ contract guarantee OK;
 var a,b,c:bool;
 let
diff --git a/lustrec_tests/lustre_files/hysteresis_1.lus b/lustrec_tests/lustre_files/hysteresis_1.lus
index c741b3ea..9bd23a9b 100644
--- a/lustrec_tests/lustre_files/hysteresis_1.lus
+++ b/lustrec_tests/lustre_files/hysteresis_1.lus
@@ -26,7 +26,7 @@ let
                     else diff <= -10;
 tel
 
-node top( beacon, second : bool ) returns ( OK : bool );
+node hysteresis_1( beacon, second : bool ) returns ( OK : bool );
 --@ contract guarantee OK by 1-induction;
     var late, early : bool;
 let
diff --git a/lustrec_tests/lustre_files/two_counters.lus b/lustrec_tests/lustre_files/two_counters.lus
index 1886c4a5..afe166ed 100644
--- a/lustrec_tests/lustre_files/two_counters.lus
+++ b/lustrec_tests/lustre_files/two_counters.lus
@@ -17,7 +17,7 @@ let
 tel
 
 
-node top (x:bool) returns (OK:bool);
+node two_counters (x:bool) returns (OK:bool);
 --@ contract guarantee OK by 5-induction;
 var b,d:bool;
 let
diff --git a/lustrec_tests/wcet/dune b/lustrec_tests/wcet/dune
index 97943571..76c6b87c 100644
--- a/lustrec_tests/wcet/dune
+++ b/lustrec_tests/wcet/dune
@@ -4,6 +4,7 @@
  (deps
   (:lus
    (glob_files *.lus))
+   eabi_mock.c
   ; (:cfg config.json)
  )
  (action
diff --git a/lustrec_tests/wcet/eabi_mock.c b/lustrec_tests/wcet/eabi_mock.c
new file mode 100644
index 00000000..4257f37e
--- /dev/null
+++ b/lustrec_tests/wcet/eabi_mock.c
@@ -0,0 +1,35 @@
+/* 5.1.2   The floating-point helper functions */
+/* https://github.com/ARM-software/abi-aa/blob/844a79fd4c77252a11342709e3b27b2c9f590cf1/rtabi32/rtabi32.rst#id33 */
+
+// Standard double precision floating-point arithmetic helper functions
+double __aeabi_dadd(double, double) {}
+double __aeabi_ddiv(double, double) {}
+double __aeabi_dmul(double, double) {}
+double __aeabi_drsub(double, double) {}
+double __aeabi_dsub(double, double) {}
+
+// Standard double precision floating-point comparison helper functions
+void __aeabi_cdcmpeq(double, double) {}
+void __aeabi_cdcmple(double, double) {}
+void __aeabi_cdrcmple(double, double) {}
+int __aeabi_dcmpeq(double, double) {}
+int __aeabi_dcmplt(double, double) {}
+int __aeabi_dcmple(double, double) {}
+int __aeabi_dcmpge(double, double) {}
+int __aeabi_dcmpgt(double, double) {}
+int __aeabi_dcmpun(double, double) {}
+
+/* 5.3.1   Integer (32/32 → 32) division functions */
+/* https://github.com/ARM-software/abi-aa/blob/844a79fd4c77252a11342709e3b27b2c9f590cf1/rtabi32/rtabi32.rst#531integer-3232--32-division-functions */
+
+int __aeabi_idiv(int, int) {}
+unsigned __aeabi_uidiv(unsigned, unsigned) {}
+
+typedef struct { int quot; int rem; } idiv_return;
+typedef struct { unsigned quot; unsigned rem; } uidiv_return;
+
+idiv_return __aeabi_idivmod(int, int) {}
+uidiv_return __aeabi_uidivmod(unsigned, unsigned) {}
+
+
+int main () {}
diff --git a/lustrec_tests/wcet/test.ml b/lustrec_tests/wcet/test.ml
index 0c63de1c..7d7a12f0 100644
--- a/lustrec_tests/wcet/test.ml
+++ b/lustrec_tests/wcet/test.ml
@@ -26,9 +26,17 @@ module SMap = Map.Make(String)
 
 let empty_report = SMap.empty
 
-let pp fmt =
+let pp_report fmt =
   fprintf fmt "@[<v>@[<h>#file -1x0 -1x1 -1x2 -1x3 1x0 1x1 1x2 1x3 2x0 2x1 2x2 2x3 3x0 3x1 3x2 3x3 Vnf V@]@ %a@]@."
-    (fun fmt -> SMap.iter (fun x -> fprintf fmt "%s %a" x pp_report_unit))
+    (fun fmt -> SMap.iter (fun x -> fprintf fmt "@[<h>%s %a@]@ " x pp_report_unit))
+
+let report_file cfg = Filename.concat cfg.results_directory "report"
+
+let write_report cfg report =
+  let oc = open_out (report_file cfg) in
+  let fmt = formatter_of_out_channel oc in
+  pp_report fmt report;
+  close_out oc
 
 let config_format_tags =
   set_tags true;
@@ -74,14 +82,15 @@ let lustrec_params cfg o f =
 let gcc_params cfg o f =
   [
     "-O" ^ string_of_int o;
-    "-mfloat-abi=hard";
-    "-march=armv7-a";
-    "-mfpu=vfpv3-d16";
+    (* "-mfloat-abi=hard"; *)
+    (* "-march=armv7-a"; *)
+    (* "-mfpu=vfpv3-d16"; *)
     "-nostdlib";
     "-I" ^ cfg.include_directory;
     cfg.include_directory ^ "/arrow_noalloc.c";
+    "eabi_mock.c";
     f;
-    "-lgcc"
+    (* "-lgcc" *)
   ]
 
 let gcc = "arm-none-eabi-gcc"
@@ -108,6 +117,16 @@ let cycles log =
   search_forward (regexp reg) log 0 |> ignore;
   matched_group 1 log |> int_of_string
 
+let has_velus_error log =
+  let open Re.Str in
+  let reg =
+    "Velus output Error:.+"
+  in
+  try
+    search_forward (regexp reg) log 0 |> ignore;
+    Some (matched_string log)
+  with Not_found -> None
+
 let compile cfg lustrec fs =
   printf "@.%a@." pp_header "Compilation tests";
   let n = List.length fs in
@@ -120,61 +139,75 @@ let compile cfg lustrec fs =
   (*     0 *)
   (*     fs; *)
   List.fold_left (fun (k, report) f ->
-      printf "%s@." f;
+      let p = float_of_int k *. 100. /. n_f in
+      printf "%3.0f%% @[<v 2>%s" p f;
       let k = k + 1 in
       let report_unit = empty_unit in
       (* Compile with LustreC *)
-      for lustrec_o = 0 to 3 do
-        printf "  LustreC-%d@.    " lustrec_o;
-        let cmd =
-          Filename.quote_command
-            ~stderr:err_f
-            lustrec
-            (lustrec_params cfg lustrec_o f)
-        in
-        let ic = open_process_in cmd in
-        let b = match close_process_in ic with WEXITED r -> r = 0 | _ -> false in
-        if b then
-          let f' = Filename.remove_extension f ^ ".c" in
-          let f_c = Filename.concat cfg.results_directory f' in
-          (* Compile with GCC *)
-          for gcc_o = 0 to 3 do
-            printf "GCC-%d  " gcc_o;
-            let cmd =
-              Filename.quote_command
-                ~stderr:err_f
-                gcc
-                (gcc_params cfg gcc_o f_c)
-            in
-            let ic = open_process_in cmd in
-            let b = match close_process_in ic with WEXITED r -> r = 0 | _ -> false in
-            if b then
-              let step = get_step f ^ "_step" in
+      (* begin try *)
+      (try
+        for lustrec_o = 0 to 3 do
+          (* printf "  LustreC-%d@.    " lustrec_o; *)
+          let cmd =
+            Filename.quote_command
+              ~stderr:err_f
+              lustrec
+              (lustrec_params cfg lustrec_o f)
+          in
+          let ic = open_process_in cmd in
+          let b = match close_process_in ic with WEXITED r -> r = 0 | _ -> false in
+          if b then
+            let f' = Filename.remove_extension f ^ ".c" in
+            let f_c = Filename.concat cfg.results_directory f' in
+            (* Compile with GCC *)
+            for gcc_o = 0 to 3 do
+              (* printf "GCC-%d  " gcc_o; *)
               let cmd =
                 Filename.quote_command
                   ~stderr:err_f
-                  ~stdout:out_f
-                  otawa
-                  (otawa_params step)
+                  gcc
+                  (gcc_params cfg gcc_o f_c)
               in
               let ic = open_process_in cmd in
-              (match close_process_in ic with
-              | WEXITED _ ->
-                let log = read_whole_file out_f in
-                report_unit.lustrec_gcc.(lustrec_o).(gcc_o) <- cycles log
-              | WSIGNALED n ->
-                print_endline ("OTAWA sig" ^ string_of_int n)
-              | WSTOPPED n ->
-                print_endline ("OTAWA stp" ^ string_of_int n)
-              )
-            else print_endline "GCC ko"
-          done;
-          printf "@."
-        else print_endline "LustreC ko"
-      done;
-      let p = float_of_int k *. 100. /. n_f in
-      printf "@.%3.0f%%@." p;
-      k, SMap.add Filename.(basename (remove_extension f)) report_unit report)
+              let b = match close_process_in ic with WEXITED r -> r = 0 | _ -> false in
+              if b then
+                let step = get_step f ^ "_step" in
+                let cmd =
+                  Filename.quote_command
+                    ~stderr:err_f
+                    ~stdout:out_f
+                    otawa
+                    (otawa_params step)
+                in
+                let ic = open_process_in cmd in
+                (match close_process_in ic with
+                 | WEXITED n when n <> 2 ->
+                   let log = read_whole_file out_f in
+                   report_unit.lustrec_gcc.(lustrec_o).(gcc_o) <- cycles log
+                 | _ ->
+                   print_endline "OTAWA ko"
+                )
+              else begin
+                let log = read_whole_file err_f in
+                print_endline log;
+                exit 1
+              end
+            done;
+            (* printf "@." *)
+          else begin
+            let log = read_whole_file err_f in
+            match has_velus_error log with
+            | Some m ->
+              printf "@ %s" m;
+              raise Exit
+            | None -> printf "@ %s" log
+          end
+        done
+       with Exit -> ());
+      printf "@]@.";
+      let report = SMap.add Filename.(basename (remove_extension f)) report_unit report in
+     write_report cfg report;
+      k, report)
     (0, empty_report) fs
 
       (* let n = List.length fs in *)
-- 
GitLab