diff --git a/hercules_ir/src/dot.rs b/hercules_ir/src/dot.rs index 7ad8c6dfa0dbdafc2bc1a9a765a847932cfeadf3..6d5e8a77a156c43a23ea87d882c4a8f2d7920171 100644 --- a/hercules_ir/src/dot.rs +++ b/hercules_ir/src/dot.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::env::temp_dir; use std::fmt::Write; use std::fs::File; @@ -93,7 +93,9 @@ pub fn write_dot<W: Write>( color, module, typing, + &function.labels[node_id.idx()], &function.schedules[node_id.idx()], + &module.labels, w, )?; } @@ -254,7 +256,9 @@ fn write_node<W: Write>( color: &str, module: &Module, typing: Option<&ModuleTyping>, + label_set: &HashSet<LabelID>, schedules: &Vec<Schedule>, + labels: &Vec<String>, w: &mut W, ) -> std::fmt::Result { let node = &module.functions[function_id.idx()].nodes[node_id.idx()]; @@ -341,62 +345,39 @@ fn write_node<W: Write>( if let Some(ty) = typing.map(|typing| typing[function_id.idx()][node_id.idx()]) { module.write_type(ty, &mut tylabel)?; } - + let mut iter = label_set.into_iter(); + let label_set = if let Some(first) = iter.next() { + iter.fold(format!("{}", labels[first.idx()]), |b, i| { + format!("{}, {}", b, labels[i.idx()]) + }) + } else { + String::new() + }; let mut iter = schedules.into_iter(); let schedules = if let Some(first) = iter.next() { iter.fold(format!("{:?}", first), |b, i| format!("{}, {:?}", b, i)) } else { String::new() }; - if tylabel.is_empty() && schedules.is_empty() { - write!( - w, - "{}_{}_{} [xlabel={}, label=<{}>, color={}];\n", - node.lower_case_name(), - function_id.idx(), - node_id.idx(), - xlabel, - label, - color - )?; - } else if schedules.is_empty() { - write!( - w, - "{}_{}_{} [xlabel={}, label=<{}<BR /><FONT POINT-SIZE=\"8\">{}</FONT>>, color={}];\n", - node.lower_case_name(), - function_id.idx(), - node_id.idx(), - xlabel, - label, - tylabel, - color - )?; - } else if tylabel.is_empty() { - write!( - w, - "{}_{}_{} [xlabel={}, label=<{}<BR /><FONT POINT-SIZE=\"8\">{}</FONT>>, color={}];\n", - node.lower_case_name(), - function_id.idx(), - node_id.idx(), - xlabel, - label, - schedules, - color - )?; - } else { - write!( - w, - "{}_{}_{} [xlabel={}, label=<{}<BR /><FONT POINT-SIZE=\"8\">{}</FONT><BR /><FONT POINT-SIZE=\"8\">{}</FONT>>, color={}];\n", - node.lower_case_name(), - function_id.idx(), - node_id.idx(), - xlabel, - label, - tylabel, - schedules, - color - )?; + write!( + w, + "{}_{}_{} [xlabel={}, label=<{}", + node.lower_case_name(), + function_id.idx(), + node_id.idx(), + xlabel, + label, + )?; + if !tylabel.is_empty() { + write!(w, "<BR /><FONT POINT-SIZE=\"8\">{}</FONT>", tylabel,)?; + } + if !label_set.is_empty() { + write!(w, "<BR /><FONT POINT-SIZE=\"8\">{}</FONT>", label_set,)?; + } + if !schedules.is_empty() { + write!(w, "<BR /><FONT POINT-SIZE=\"8\">{}</FONT>", schedules,)?; } + write!(w, ">, color={}];\n", color)?; Ok(()) }