Project

General

Profile

Revision d50b0dc0 src/scheduling.ml

View differences:

src/scheduling.ml
31 31
   For variables still unrelated, standard compare is used to choose the minimal element.
32 32
   This priority is used since it helps a lot in factorizing generated code.
33 33
   Moreover, the dependency graph is browsed in a depth-first manner whenever possible,
34
   to improve the behavior of optimization algorithms applied in forthcoming compilation steps.
34
   to improve the behavior of optimization algorithms applied in forthcoming compilation steps. 
35 35
   In the following functions:
36 36
   - [eq_equiv] is the equivalence relation between vars of the same equation lhs
37 37
   - [g] the (imperative) graph to be topologically sorted
......
46 46
 List.exists ExprDep.is_instance_var (IdentDepGraph.succ g choice)
47 47

  
48 48
(* Adds successors of [v] in graph [g] in [pending] or [frontier] sets, wrt [eq_equiv],
49
   then removes [v] from [g]
49
   then removes [v] from [g] 
50 50
*)
51 51
let add_successors eq_equiv g v pending frontier =
52 52
  let succs_v = IdentDepGraph.succ g v in
53 53
  begin
54 54
    IdentDepGraph.remove_vertex g v;
55
    List.iter
56
      (fun v' ->
57
	if is_graph_root v' g then
58
	  (if eq_equiv v v' then
59
	      pending := ISet.add v' !pending
55
    List.iter 
56
      (fun v' -> 
57
	if is_graph_root v' g then 
58
	  (if eq_equiv v v' then 
59
	      pending := ISet.add v' !pending 
60 60
	   else
61 61
	      frontier := ISet.add v' !frontier)
62 62
      ) succs_v;
......
134 134
      with Not_found -> false in
135 135

  
136 136
    let n', g = global_dependency n in
137
    Log.report ~level:5
138
      (fun fmt ->
137
    Log.report ~level:5 
138
      (fun fmt -> 
139 139
	Format.fprintf fmt
140
	  "dependency graph for node %s: %a"
140
	  "dependency graph for node %s: %a" 
141 141
	  n'.node_id
142 142
	  pp_dep_graph g
143 143
      );
144

  
144
    
145 145
    (* TODO X: extend the graph with inputs (adapt the causality analysis to deal with inputs
146 146
     compute: coi predecessors of outputs
147 147
     warning (no modification) when memories are non used (do not impact output) or when inputs are not used (do not impact output)
......
166 166
    if !Options.print_reuse
167 167
    then
168 168
      begin
169
	Log.report ~level:0
170
	  (fun fmt ->
169
	Log.report ~level:0 
170
	  (fun fmt -> 
171 171
	    Format.fprintf fmt
172 172
	      "OPT:%B@." (try (Hashtbl.iter (fun s1 v2 -> if s1 = v2.var_id then raise Not_found) reuse; false) with Not_found -> true)
173 173
	  );
174
	Log.report ~level:0
175
	  (fun fmt ->
174
	Log.report ~level:0 
175
	  (fun fmt -> 
176 176
	    Format.fprintf fmt
177
	      "OPT:clock disjoint map for node %s: %a"
177
	      "OPT:clock disjoint map for node %s: %a" 
178 178
	      n'.node_id
179 179
	      Disjunction.pp_disjoint_map disjoint
180 180
	  );
181
	Log.report ~level:0
182
	  (fun fmt ->
181
	Log.report ~level:0 
182
	  (fun fmt -> 
183 183
	    Format.fprintf fmt
184
	      "OPT:reuse policy for node %s: %a"
184
	      "OPT:reuse policy for node %s: %a" 
185 185
	      n'.node_id
186 186
	      Liveness.pp_reuse_policy reuse
187 187
	  );
......
196 196
  List.fold_right (
197 197
    fun top_decl (accu_prog, sch_map)  ->
198 198
      match top_decl.top_decl_desc with
199
	| Node nd ->
199
	| Node nd -> 
200 200
	  let nd', report = schedule_node nd in
201
	  {top_decl with top_decl_desc = Node nd'}::accu_prog,
201
	  {top_decl with top_decl_desc = Node nd'}::accu_prog, 
202 202
	  IMap.add nd.node_id report sch_map
203 203
	| _ -> top_decl::accu_prog, sch_map
204
    )
204
    ) 
205 205
    prog
206 206
    ([],IMap.empty)
207 207

  
......
210 210
  | []  -> assert false
211 211
  | [v] -> Format.fprintf fmt "%s" v
212 212
  | _   -> Format.fprintf fmt "(%a)" (fprintf_list ~sep:" , " (fun fmt v -> Format.fprintf fmt "%s" v)) vl
213

  
213
 
214 214
let pp_schedule fmt node_schs =
215 215
 IMap.iter
216 216
   (fun nd report ->

Also available in: Unified diff