From ff32d2d5bdcb4dba0d12b22739ad13cae05de1fa Mon Sep 17 00:00:00 2001 From: hneemann Date: Mon, 26 May 2025 18:15:17 +0200 Subject: [PATCH] fixed an issue in creating a fsm with constant functions and D ff --- .../neemann/digital/builder/circuit/CircuitBuilder.java | 8 ++++++-- .../digital/builder/circuit/CircuitBuilderTest.java | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java index 7efa3c02a..d273f7bd9 100644 --- a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java +++ b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java @@ -58,6 +58,7 @@ public class CircuitBuilder implements BuilderInterface { private int pos; private boolean useLUT; private boolean useJKff; + private boolean useDWithConst; private ModelAnalyserInfo mai; private int lutNumber; private boolean resolveLocalVars; @@ -82,6 +83,7 @@ public class CircuitBuilder implements BuilderInterface { public CircuitBuilder(ShapeFactory shapeFactory, ArrayList varOrdering) { this.shapeFactory = shapeFactory; this.useJKff = false; + this.useDWithConst = false; this.useLUT = false; desiredVarOrdering = varOrdering; variableVisitor = new VariableVisitor(); @@ -226,9 +228,11 @@ public class CircuitBuilder implements BuilderInterface { if (useDff) { Fragment fr = createFragment(expression); Fragment fe; - if (expression instanceof Constant) + if (expression instanceof Constant && ((((Constant) expression).getValue() ? 1 : 0) == initValue)) fe = new FragmentVisualElement(Tunnel.DESCRIPTION, shapeFactory).setAttr(Keys.NETNAME, name); else { + if (expression instanceof Constant) + useDWithConst = true; FragmentVisualElement ff = new FragmentVisualElement(FlipflopD.DESCRIPTION, shapeFactory) .setAttr(Keys.LABEL, name) .setAttr(Keys.DEFAULT, initValue); @@ -698,7 +702,7 @@ public class CircuitBuilder implements BuilderInterface { if (p.y > yMax) yMax = p.y; } x -= SIZE; - if (useJKff) x -= SIZE; + if (useJKff || useDWithConst) x -= SIZE; int yPos = yMin - SIZE * 3; if (useJKff) yPos = -SIZE; diff --git a/src/test/java/de/neemann/digital/builder/circuit/CircuitBuilderTest.java b/src/test/java/de/neemann/digital/builder/circuit/CircuitBuilderTest.java index b8c16be35..a491917e0 100644 --- a/src/test/java/de/neemann/digital/builder/circuit/CircuitBuilderTest.java +++ b/src/test/java/de/neemann/digital/builder/circuit/CircuitBuilderTest.java @@ -184,7 +184,7 @@ public class CircuitBuilderTest extends TestCase { .createCircuit(); final ArrayList el = circuit.getElements(); - assertEquals(8, el.size()); + assertEquals(10, el.size()); assertEquals(4, el.stream().filter(visualElement -> visualElement.equalsDescription(Tunnel.DESCRIPTION)).count()); assertEquals(2, el.stream().filter(visualElement -> visualElement.equalsDescription(Const.DESCRIPTION)).count()); assertEquals(2, el.stream().filter(visualElement -> visualElement.equalsDescription(Out.DESCRIPTION)).count()); @@ -199,7 +199,7 @@ public class CircuitBuilderTest extends TestCase { .createCircuit(); final ArrayList el = circuit.getElements(); - assertEquals(8, el.size()); + assertEquals(10, el.size()); assertEquals(4, el.stream().filter(visualElement -> visualElement.equalsDescription(Tunnel.DESCRIPTION)).count()); assertEquals(2, el.stream().filter(visualElement -> visualElement.equalsDescription(Const.DESCRIPTION)).count()); assertEquals(2, el.stream().filter(visualElement -> visualElement.equalsDescription(Out.DESCRIPTION)).count());