From 7d3495e7b877859ba1d63135c11c077821e3dce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Mon, 15 Apr 2019 10:35:03 +0200 Subject: [PATCH] [Eva] Moves feedback messages about partitioning in trace_partitioning. --- src/plugins/value/engine/iterator.ml | 25 +----------- .../value/engine/trace_partitioning.ml | 40 ++++++++++++++----- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/plugins/value/engine/iterator.ml b/src/plugins/value/engine/iterator.ml index a7f9573a00e..541d61dd21f 100644 --- a/src/plugins/value/engine/iterator.ml +++ b/src/plugins/value/engine/iterator.ml @@ -89,9 +89,6 @@ module Make_Dataflow let interpreter_mode = Value_parameters.InterpreterMode.get () - let slevel_display_step : int = - Value_parameters.ShowSlevel.get () - (* Ideally, the slevel parameter should not be used anymore in this file but it is still required for logic interpretation *) let slevel = @@ -394,18 +391,6 @@ module Make_Dataflow (* --- Iteration strategy ---*) - let output_slevel : int -> unit = - let max_displayed = ref 0 in - fun x -> - if x >= !max_displayed + slevel_display_step - then begin - let rounded = x / slevel_display_step * slevel_display_step in - Value_parameters.feedback ~once:true ~current:true - "Semantic level unrolling superposing up to %d states" - rounded; - max_displayed := rounded; - end - let process_partitioning_transitions (v1 : vertex) (v2 : vertex) (transition : vertex transition) (flow : flow) : flow = (* Split return *) @@ -481,15 +466,7 @@ module Make_Dataflow (* Callbacks *) call_statement_callbacks stmt flow; (* Transfer function associated to the statement *) - let flow = Partition.transfer (transfer_statement stmt) flow in - (* Output slevel related things *) - let store_size = Partition.store_size store in - output_slevel store_size; - (* Debug informations *) - Value_parameters.debug ~dkey ~current:true - "reached statement %d with %d / %d eternal states, %d to propagate" - stmt.sid store_size (slevel stmt) (Partition.flow_size flow); - flow + Partition.transfer (transfer_statement stmt) flow | _ -> flow in (* Widen if necessary *) diff --git a/src/plugins/value/engine/trace_partitioning.ml b/src/plugins/value/engine/trace_partitioning.ml index de0cbb64c05..71cb5fab948 100644 --- a/src/plugins/value/engine/trace_partitioning.ml +++ b/src/plugins/value/engine/trace_partitioning.ml @@ -42,12 +42,13 @@ struct type state = Domain.t type store = { - rationing: Partition.rationing; - flow_actions : action list; + rationing: Partition.rationing; (* slevel rationing at this point *) + flow_actions : action list; (* partitioning actions to be applied *) store_stmt : stmt option; - store_index : Index.t; - mutable store_partition : state partition; - mutable store_size : int; + store_index : Index.t; (* Index of all states stored: used to quickly remove + new states that have already been propagated. *) + mutable store_partition : state partition; (* partition of states *) + mutable incoming_states : int; (* number of incoming states. *) } type flow = Flow.t @@ -80,7 +81,7 @@ struct store_stmt = stmt; store_index = Index.empty (); store_partition = Partition.empty; - store_size = 0; + incoming_states = 0; } let empty_flow : flow = Flow.empty @@ -133,7 +134,7 @@ struct Partition.is_empty t.tank_states let store_size (s : store) : int = - s.store_size + Partition.size s.store_partition let flow_size (flow : flow) : int = Flow.size flow @@ -212,6 +213,25 @@ struct let transfer = Flow.transfer_states + let output_slevel : int -> unit = + let slevel_display_step = Value_parameters.ShowSlevel.get () in + let max_displayed = ref 0 in + fun x -> + if x >= !max_displayed + slevel_display_step + then + let rounded = x / slevel_display_step * slevel_display_step in + Value_parameters.feedback ~once:true ~current:true + "Semantic level unrolling superposing up to %d states" + rounded; + max_displayed := rounded + + let partitioning_feedback dest flow stmt = + output_slevel dest.incoming_states; + (* Debug information. *) + Value_parameters.debug ~dkey:Value_parameters.dkey_iterator ~current:true + "reached statement %d with %d incoming states, %d to propagate" + stmt.sid dest.incoming_states (flow_size flow) + let join (sources : (branch*flow) list) (dest : store) : flow = let is_loop_head = match dest.store_stmt with @@ -234,7 +254,7 @@ struct List.fold_left Flow.union Flow.empty sources_states in (* Handle ration stamps *) - dest.store_size <- dest.store_size + Flow.size flow_states; + dest.incoming_states <- dest.incoming_states + Flow.size flow_states; let rationing_action = Ration dest.rationing in (* Handle Split / Merge operations *) let flow_actions = Update_dynamic_splits :: dest.flow_actions in @@ -272,7 +292,9 @@ struct Extlib.opt_filter (fun s -> Index.add s dest.store_index) state in let flow = Flow.join_duplicate_keys flow_states in - Flow.filter_map update flow + let flow = Flow.filter_map update flow in + Extlib.may (partitioning_feedback dest flow) dest.store_stmt; + flow let widen (w : widening) (flow : flow) : flow = let stmt = w.widening_stmt in -- GitLab