Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Various cleanups to the model-checking user interface
[simgrid.git] / src / mc / mc_global.c
index dd6761c..f62e2f7 100644 (file)
@@ -12,7 +12,7 @@
 #include "../simix/smx_private.h"
 #include "xbt/fifo.h"
 #include "mc_private.h"
-#include "xbt/automaton/automaton_create.h"
+#include "xbt/automaton.h"
 
 XBT_LOG_NEW_CATEGORY(mc, "All MC categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
@@ -36,9 +36,8 @@ mc_stats_pair_t mc_stats_pair = NULL;
 xbt_fifo_t mc_stack_liveness = NULL;
 mc_snapshot_t initial_snapshot_liveness = NULL;
 
-xbt_automaton_t automaton;
+xbt_automaton_t _mc_property_automaton = NULL;
 
-static void MC_init_liveness(xbt_automaton_t a);
 static void MC_assert_pair(int prop);
 
 
@@ -78,8 +77,16 @@ void MC_init_safety(void)
 }
 
 
-static void MC_init_liveness(xbt_automaton_t a){
 
+void MC_modelcheck(void)
+{
+  MC_init_safety();
+  MC_dpor();
+  MC_exit();
+}
+
+void MC_modelcheck_liveness(){
+  /* init stuff */
   XBT_DEBUG("Start init mc");
   
   mc_time = xbt_new0(double, simix_process_maxpid);
@@ -99,30 +106,10 @@ static void MC_init_liveness(xbt_automaton_t a){
 
   MC_UNSET_RAW_MEM;
 
-  automaton = a;
 
   MC_ddfs_init();
 
-  
-}
-
-
-void MC_modelcheck(void)
-{
-  MC_init_safety();
-  MC_dpor();
-  MC_exit();
-}
-
-
-
-void MC_modelcheck_liveness(xbt_automaton_t a){
-  MC_init_liveness(a);
-  MC_exit_liveness();
-}
-
-void MC_exit_liveness(void)
-{
+  /* We're done */
   MC_print_statistics_pairs(mc_stats_pair);
   //xbt_free(mc_time);
   //MC_memory_exit();
@@ -181,29 +168,39 @@ int MC_deadlock_check()
 }
 
 /**
- * \brief Re-executes from the start state all the transitions indicated by
+ * \brief Re-executes from the state at position start all the transitions indicated by
  *        a given model-checker stack.
  * \param stack The stack with the transitions to execute.
  * \param start Start index to begin the re-execution.
  */
 void MC_replay(xbt_fifo_t stack, int start)
 {
-  int value;
+  int value, i = 1;
   char *req_str;
   smx_simcall_t req = NULL, saved_req = NULL;
-  xbt_fifo_item_t item;
+  xbt_fifo_item_t item, start_item;
   mc_state_t state;
 
   XBT_DEBUG("**** Begin Replay ****");
 
-  /* Restore the initial state */
-  MC_restore_snapshot(initial_snapshot);
-  /* At the moment of taking the snapshot the raw heap was set, so restoring
-   * it will set it back again, we have to unset it to continue  */
-  MC_UNSET_RAW_MEM;
+  if(start == -1){
+    /* Restore the initial state */
+    MC_restore_snapshot(initial_snapshot);
+    /* At the moment of taking the snapshot the raw heap was set, so restoring
+     * it will set it back again, we have to unset it to continue  */
+    MC_UNSET_RAW_MEM;
+  }
 
-  /* Traverse the stack from the initial state and re-execute the transitions */
-  for (item = xbt_fifo_get_last_item(stack);
+  start_item = xbt_fifo_get_last_item(stack);
+  if(start != -1){
+    while (i != start){
+      start_item = xbt_fifo_get_prev_item(start_item);
+      i++;
+    }
+  }
+
+  /* Traverse the stack from the state at position start and re-execute the transitions */
+  for (item = start_item;
        item != xbt_fifo_get_first_item(stack);
        item = xbt_fifo_get_prev_item(item)) {
 
@@ -521,9 +518,17 @@ void MC_diff(void){
 
 }
 
-xbt_automaton_t MC_create_automaton(const char *file){
+void MC_automaton_load(const char *file){
+  MC_SET_RAW_MEM;
+  if (_mc_property_automaton == NULL)
+    _mc_property_automaton = xbt_automaton_new();
+  xbt_automaton_load(_mc_property_automaton,file);
+  MC_UNSET_RAW_MEM;
+}
+void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
   MC_SET_RAW_MEM;
-  xbt_automaton_t a = xbt_create_automaton(file);
+  if (_mc_property_automaton == NULL)
+    _mc_property_automaton = xbt_automaton_new();
+  xbt_new_propositional_symbol(_mc_property_automaton,id,fct);
   MC_UNSET_RAW_MEM;
-  return a;
 }