From 218eec892429f5b8c93da260ba163b88ec4bcfc3 Mon Sep 17 00:00:00 2001 From: Shane Vandegrift Date: Wed, 22 Nov 2023 21:51:58 -0500 Subject: [PATCH] add comment for the dlatch test --- graph.dot | 263 +++++++-------------------------------------------- src/gates.rs | 10 ++ 2 files changed, 43 insertions(+), 230 deletions(-) diff --git a/graph.dot b/graph.dot index 4c69f1a..fe9f9c7 100644 --- a/graph.dot +++ b/graph.dot @@ -1,234 +1,37 @@ digraph { 0 [ label = "Set(0, false)" ] 1 [ label = "Set(1, false)" ] - 2 [ label = "Set(2, false)" ] - 3 [ label = "Set(3, false)" ] - 4 [ label = "Set(4, false)" ] - 5 [ label = "Set(5, false)" ] - 6 [ label = "Set(6, false)" ] - 7 [ label = "Set(7, false)" ] - 8 [ label = "Nand(3, 3, 22)" ] - 9 [ label = "Nand(7, 7, 23)" ] - 10 [ label = "Nand(22, 23, 20)" ] - 11 [ label = "Nand(3, 7, 21)" ] - 12 [ label = "Nand(20, 21, 24)" ] - 13 [ label = "Nand(24, 24, 17)" ] - 14 [ label = "Nand(3, 7, 25)" ] - 15 [ label = "Nand(25, 25, 18)" ] - 16 [ label = "Nand(17, 17, 28)" ] - 17 [ label = "Nand(13, 13, 29)" ] - 18 [ label = "Nand(28, 29, 26)" ] - 19 [ label = "Nand(17, 13, 27)" ] - 20 [ label = "Nand(26, 27, 30)" ] - 21 [ label = "Nand(30, 30, 12)" ] - 22 [ label = "Nand(17, 13, 31)" ] - 23 [ label = "Nand(31, 31, 19)" ] - 24 [ label = "Nand(18, 18, 32)" ] - 25 [ label = "Nand(19, 19, 33)" ] - 26 [ label = "Nand(32, 33, 14)" ] - 27 [ label = "Nand(2, 2, 39)" ] - 28 [ label = "Nand(6, 6, 40)" ] - 29 [ label = "Nand(39, 40, 37)" ] - 30 [ label = "Nand(2, 6, 38)" ] - 31 [ label = "Nand(37, 38, 41)" ] - 32 [ label = "Nand(41, 41, 34)" ] - 33 [ label = "Nand(2, 6, 42)" ] - 34 [ label = "Nand(42, 42, 35)" ] - 35 [ label = "Nand(34, 34, 45)" ] - 36 [ label = "Nand(14, 14, 46)" ] - 37 [ label = "Nand(45, 46, 43)" ] - 38 [ label = "Nand(34, 14, 44)" ] - 39 [ label = "Nand(43, 44, 47)" ] - 40 [ label = "Nand(47, 47, 11)" ] - 41 [ label = "Nand(34, 14, 48)" ] - 42 [ label = "Nand(48, 48, 36)" ] - 43 [ label = "Nand(35, 35, 49)" ] - 44 [ label = "Nand(36, 36, 50)" ] - 45 [ label = "Nand(49, 50, 15)" ] - 46 [ label = "Nand(1, 1, 56)" ] - 47 [ label = "Nand(5, 5, 57)" ] - 48 [ label = "Nand(56, 57, 54)" ] - 49 [ label = "Nand(1, 5, 55)" ] - 50 [ label = "Nand(54, 55, 58)" ] - 51 [ label = "Nand(58, 58, 51)" ] - 52 [ label = "Nand(1, 5, 59)" ] - 53 [ label = "Nand(59, 59, 52)" ] - 54 [ label = "Nand(51, 51, 62)" ] - 55 [ label = "Nand(15, 15, 63)" ] - 56 [ label = "Nand(62, 63, 60)" ] - 57 [ label = "Nand(51, 15, 61)" ] - 58 [ label = "Nand(60, 61, 64)" ] - 59 [ label = "Nand(64, 64, 10)" ] - 60 [ label = "Nand(51, 15, 65)" ] - 61 [ label = "Nand(65, 65, 53)" ] - 62 [ label = "Nand(52, 52, 66)" ] - 63 [ label = "Nand(53, 53, 67)" ] - 64 [ label = "Nand(66, 67, 16)" ] - 65 [ label = "Nand(0, 0, 73)" ] - 66 [ label = "Nand(4, 4, 74)" ] - 67 [ label = "Nand(73, 74, 71)" ] - 68 [ label = "Nand(0, 4, 72)" ] - 69 [ label = "Nand(71, 72, 75)" ] - 70 [ label = "Nand(75, 75, 68)" ] - 71 [ label = "Nand(0, 4, 76)" ] - 72 [ label = "Nand(76, 76, 69)" ] - 73 [ label = "Nand(68, 68, 79)" ] - 74 [ label = "Nand(16, 16, 80)" ] - 75 [ label = "Nand(79, 80, 77)" ] - 76 [ label = "Nand(68, 16, 78)" ] - 77 [ label = "Nand(77, 78, 81)" ] - 78 [ label = "Nand(81, 81, 9)" ] - 79 [ label = "Nand(68, 16, 82)" ] - 80 [ label = "Nand(82, 82, 70)" ] - 81 [ label = "Nand(69, 69, 83)" ] - 82 [ label = "Nand(70, 70, 84)" ] - 83 [ label = "Nand(83, 84, 8)" ] - 3 -> 22 [ label = "()" ] - 3 -> 22 [ label = "()" ] - 7 -> 23 [ label = "()" ] - 7 -> 23 [ label = "()" ] - 22 -> 20 [ label = "()" ] - 23 -> 20 [ label = "()" ] - 3 -> 21 [ label = "()" ] - 7 -> 21 [ label = "()" ] - 20 -> 24 [ label = "()" ] - 21 -> 24 [ label = "()" ] - 24 -> 17 [ label = "()" ] - 24 -> 17 [ label = "()" ] - 3 -> 25 [ label = "()" ] - 7 -> 25 [ label = "()" ] - 25 -> 18 [ label = "()" ] - 25 -> 18 [ label = "()" ] - 17 -> 28 [ label = "()" ] - 17 -> 28 [ label = "()" ] - 13 -> 29 [ label = "()" ] - 13 -> 29 [ label = "()" ] - 28 -> 26 [ label = "()" ] - 29 -> 26 [ label = "()" ] - 17 -> 27 [ label = "()" ] - 13 -> 27 [ label = "()" ] - 26 -> 30 [ label = "()" ] - 27 -> 30 [ label = "()" ] - 30 -> 12 [ label = "()" ] - 30 -> 12 [ label = "()" ] - 17 -> 31 [ label = "()" ] - 13 -> 31 [ label = "()" ] - 31 -> 19 [ label = "()" ] - 31 -> 19 [ label = "()" ] - 18 -> 32 [ label = "()" ] - 18 -> 32 [ label = "()" ] - 19 -> 33 [ label = "()" ] - 19 -> 33 [ label = "()" ] - 32 -> 14 [ label = "()" ] - 33 -> 14 [ label = "()" ] - 2 -> 39 [ label = "()" ] - 2 -> 39 [ label = "()" ] - 6 -> 40 [ label = "()" ] - 6 -> 40 [ label = "()" ] - 39 -> 37 [ label = "()" ] - 40 -> 37 [ label = "()" ] - 2 -> 38 [ label = "()" ] - 6 -> 38 [ label = "()" ] - 37 -> 41 [ label = "()" ] - 38 -> 41 [ label = "()" ] - 41 -> 34 [ label = "()" ] - 41 -> 34 [ label = "()" ] - 2 -> 42 [ label = "()" ] - 6 -> 42 [ label = "()" ] - 42 -> 35 [ label = "()" ] - 42 -> 35 [ label = "()" ] - 34 -> 45 [ label = "()" ] - 34 -> 45 [ label = "()" ] - 14 -> 46 [ label = "()" ] - 14 -> 46 [ label = "()" ] - 45 -> 43 [ label = "()" ] - 46 -> 43 [ label = "()" ] - 34 -> 44 [ label = "()" ] - 14 -> 44 [ label = "()" ] - 43 -> 47 [ label = "()" ] - 44 -> 47 [ label = "()" ] - 47 -> 11 [ label = "()" ] - 47 -> 11 [ label = "()" ] - 34 -> 48 [ label = "()" ] - 14 -> 48 [ label = "()" ] - 48 -> 36 [ label = "()" ] - 48 -> 36 [ label = "()" ] - 35 -> 49 [ label = "()" ] - 35 -> 49 [ label = "()" ] - 36 -> 50 [ label = "()" ] - 36 -> 50 [ label = "()" ] - 49 -> 15 [ label = "()" ] - 50 -> 15 [ label = "()" ] - 1 -> 56 [ label = "()" ] - 1 -> 56 [ label = "()" ] - 5 -> 57 [ label = "()" ] - 5 -> 57 [ label = "()" ] - 56 -> 54 [ label = "()" ] - 57 -> 54 [ label = "()" ] - 1 -> 55 [ label = "()" ] - 5 -> 55 [ label = "()" ] - 54 -> 58 [ label = "()" ] - 55 -> 58 [ label = "()" ] - 58 -> 51 [ label = "()" ] - 58 -> 51 [ label = "()" ] - 1 -> 59 [ label = "()" ] - 5 -> 59 [ label = "()" ] - 59 -> 52 [ label = "()" ] - 59 -> 52 [ label = "()" ] - 51 -> 62 [ label = "()" ] - 51 -> 62 [ label = "()" ] - 15 -> 63 [ label = "()" ] - 15 -> 63 [ label = "()" ] - 62 -> 60 [ label = "()" ] - 63 -> 60 [ label = "()" ] - 51 -> 61 [ label = "()" ] - 15 -> 61 [ label = "()" ] - 60 -> 64 [ label = "()" ] - 61 -> 64 [ label = "()" ] - 64 -> 10 [ label = "()" ] - 64 -> 10 [ label = "()" ] - 51 -> 65 [ label = "()" ] - 15 -> 65 [ label = "()" ] - 65 -> 53 [ label = "()" ] - 65 -> 53 [ label = "()" ] - 52 -> 66 [ label = "()" ] - 52 -> 66 [ label = "()" ] - 53 -> 67 [ label = "()" ] - 53 -> 67 [ label = "()" ] - 66 -> 16 [ label = "()" ] - 67 -> 16 [ label = "()" ] - 0 -> 73 [ label = "()" ] - 0 -> 73 [ label = "()" ] - 4 -> 74 [ label = "()" ] - 4 -> 74 [ label = "()" ] - 73 -> 71 [ label = "()" ] - 74 -> 71 [ label = "()" ] - 0 -> 72 [ label = "()" ] - 4 -> 72 [ label = "()" ] - 71 -> 75 [ label = "()" ] - 72 -> 75 [ label = "()" ] - 75 -> 68 [ label = "()" ] - 75 -> 68 [ label = "()" ] - 0 -> 76 [ label = "()" ] - 4 -> 76 [ label = "()" ] - 76 -> 69 [ label = "()" ] - 76 -> 69 [ label = "()" ] - 68 -> 79 [ label = "()" ] - 68 -> 79 [ label = "()" ] - 16 -> 80 [ label = "()" ] - 16 -> 80 [ label = "()" ] - 79 -> 77 [ label = "()" ] - 80 -> 77 [ label = "()" ] - 68 -> 78 [ label = "()" ] - 16 -> 78 [ label = "()" ] - 77 -> 81 [ label = "()" ] - 78 -> 81 [ label = "()" ] - 81 -> 9 [ label = "()" ] - 81 -> 9 [ label = "()" ] - 68 -> 82 [ label = "()" ] - 16 -> 82 [ label = "()" ] - 82 -> 70 [ label = "()" ] - 82 -> 70 [ label = "()" ] - 69 -> 83 [ label = "()" ] - 69 -> 83 [ label = "()" ] + 2 [ label = "Nand(11, 12, 2)" ] + 3 [ label = "Nand(5, 5, 3)" ] + 4 [ label = "Nand(8, 8, 4)" ] + 5 [ label = "Nand(6, 7, 5)" ] + 6 [ label = "Nand(0, 0, 6)" ] + 7 [ label = "Nand(4, 4, 7)" ] + 8 [ label = "Nand(9, 10, 8)" ] + 9 [ label = "Nand(1, 1, 9)" ] + 10 [ label = "Nand(3, 3, 10)" ] + 11 [ label = "Nand(4, 4, 11)" ] + 12 [ label = "Nand(4, 4, 12)" ] + 0 -> 6 [ label = "()" ] + 0 -> 6 [ label = "()" ] + 4 -> 7 [ label = "()" ] + 4 -> 7 [ label = "()" ] + 6 -> 5 [ label = "()" ] + 7 -> 5 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 1 -> 9 [ label = "()" ] + 1 -> 9 [ label = "()" ] + 3 -> 10 [ label = "()" ] + 3 -> 10 [ label = "()" ] + 9 -> 8 [ label = "()" ] + 10 -> 8 [ label = "()" ] + 8 -> 4 [ label = "()" ] + 8 -> 4 [ label = "()" ] + 4 -> 11 [ label = "()" ] + 4 -> 11 [ label = "()" ] + 4 -> 12 [ label = "()" ] + 4 -> 12 [ label = "()" ] + 11 -> 2 [ label = "()" ] + 12 -> 2 [ label = "()" ] } diff --git a/src/gates.rs b/src/gates.rs index e97a2f4..092e63b 100644 --- a/src/gates.rs +++ b/src/gates.rs @@ -556,6 +556,16 @@ mod tests { simulation.run(&[true, false]); assert!(!simulation.registers[dlatch.q]); + // FIXME: We shouldn't need to run the DLatch twice to get the correct result + // + // This is due to us compiling things and running them once. + // The core of a DLatch is an RS-NOR latch, which is a loop + // and technically needs to run twice to get the correct result. + // + // A few ideas: + // 1. Detect recursion in the simulation and run the cyclic ops twice + // 2. Similar to #1, except manually add double ops for the RS-NOR latch + simulation.run(&[true, true]); simulation.run(&[true, true]); assert!(simulation.registers[dlatch.q]); }