@@ -48,16 +48,15 @@ fn get_value(wires: &HashMap<&str, bool>, prefix: &str) -> u64 {
48
48
/// Convert dot file into svg:
49
49
///
50
50
/// dot -Tsvg graph.dot -o graph.svg
51
- #[ allow( unused) ]
52
- fn write_dot_file ( gates : & [ Gate < ' _ > ] ) {
53
- let mut writer = BufWriter :: new ( File :: create ( "graph.dot" ) . unwrap ( ) ) ;
51
+ fn write_dot_file ( gates : & [ Gate < ' _ > ] , filename : & str , disconnect_carry_bits : bool ) {
52
+ let mut writer = BufWriter :: new ( File :: create ( filename) . unwrap ( ) ) ;
54
53
55
54
let logic_per_wire = gates
56
55
. iter ( )
57
56
. map ( |g| ( g. out , g. logic ) )
58
57
. collect :: < HashMap < _ , _ > > ( ) ;
59
58
60
- writer. write_all ( b"digraph {{ \n " ) . unwrap ( ) ;
59
+ writer. write_all ( b"digraph {\n " ) . unwrap ( ) ;
61
60
62
61
// write all nodes and colorize them according to their gate logic
63
62
for lpw in & logic_per_wire {
@@ -67,21 +66,23 @@ fn write_dot_file(gates: &[Gate<'_>]) {
67
66
Logic :: Xor => "red" ,
68
67
} ;
69
68
writer
70
- . write_all ( format ! ( "{} [style=filled,fillcolor={}];" , lpw. 0 , color) . as_bytes ( ) )
69
+ . write_all ( format ! ( "{} [style=filled,fillcolor={}];\n " , lpw. 0 , color) . as_bytes ( ) )
71
70
. unwrap ( ) ;
72
71
}
73
72
74
73
// write all edges
75
74
for g in gates {
76
- writer
77
- . write_all ( format ! ( "{} -> {};" , g. a, g. out) . as_bytes ( ) )
78
- . unwrap ( ) ;
79
- writer
80
- . write_all ( format ! ( "{} -> {};" , g. b, g. out) . as_bytes ( ) )
81
- . unwrap ( ) ;
75
+ if !disconnect_carry_bits || g. logic != Logic :: Or || g. out . starts_with ( "z" ) {
76
+ writer
77
+ . write_all ( format ! ( "{} -> {};\n " , g. a, g. out) . as_bytes ( ) )
78
+ . unwrap ( ) ;
79
+ writer
80
+ . write_all ( format ! ( "{} -> {};\n " , g. b, g. out) . as_bytes ( ) )
81
+ . unwrap ( ) ;
82
+ }
82
83
}
83
84
84
- writer. write_all ( b"}} " ) . unwrap ( ) ;
85
+ writer. write_all ( b"}" ) . unwrap ( ) ;
85
86
}
86
87
87
88
fn run < ' a > (
@@ -238,4 +239,22 @@ fn main() {
238
239
} else {
239
240
panic ! ( "Unsolvable" ) ;
240
241
}
242
+
243
+ // visualize broken graph
244
+ write_dot_file ( & gates, "graph_broken.dot" , false ) ;
245
+
246
+ // visualize broken graph and disconnect carry bits from their inputs (this
247
+ // is what I used for debugging during the contest)
248
+ write_dot_file ( & gates, "graph_broken_disconnected.dot" , true ) ;
249
+
250
+ // visualize fixed graph
251
+ let fixed_gates = gates
252
+ . iter ( )
253
+ . map ( |g| {
254
+ let out = renames. get ( & g. out ) . unwrap_or ( & g. out ) ;
255
+ Gate { out, ..* g }
256
+ } )
257
+ . collect :: < Vec < _ > > ( ) ;
258
+ write_dot_file ( & fixed_gates, "graph_fixed.dot" , false ) ;
259
+ write_dot_file ( & fixed_gates, "graph_fixed_disconnected.dot" , true ) ;
241
260
}
0 commit comments