diff --git a/src/main/java/de/neemann/digital/draw/builder/Box.java b/src/main/java/de/neemann/digital/draw/builder/Box.java index dbeb223b3..05e7f9754 100644 --- a/src/main/java/de/neemann/digital/draw/builder/Box.java +++ b/src/main/java/de/neemann/digital/draw/builder/Box.java @@ -1,6 +1,8 @@ package de.neemann.digital.draw.builder; /** + * With and height of a fragment + * * @author hneemann */ public class Box { @@ -8,15 +10,27 @@ public class Box { private final int width; private final int height; + /** + * Create a new instance + * + * @param width width + * @param height height + */ public Box(int width, int height) { this.width = width; this.height = height; } + /** + * @return width + */ public int getWidth() { return width; } + /** + * @return height + */ public int getHeight() { return height; } diff --git a/src/main/java/de/neemann/digital/draw/builder/Builder.java b/src/main/java/de/neemann/digital/draw/builder/Builder.java index de3df0dad..7bef694f5 100644 --- a/src/main/java/de/neemann/digital/draw/builder/Builder.java +++ b/src/main/java/de/neemann/digital/draw/builder/Builder.java @@ -11,11 +11,8 @@ import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.VisualElement; import de.neemann.digital.draw.elements.Wire; import de.neemann.digital.draw.graphics.Vector; -import de.neemann.digital.draw.library.ElementLibrary; import de.neemann.digital.draw.shapes.ShapeFactory; -import de.neemann.digital.gui.Main; -import javax.swing.*; import java.util.ArrayList; import java.util.HashMap; @@ -143,23 +140,4 @@ public class Builder { return circuit; } - - public static void main(String[] args) { - Variable a = new Variable("A"); - Variable b = new Variable("B"); - Variable c = new Variable("C"); - Expression y = Operation.or(Not.not(Operation.and(a, Not.not(b), c)), Operation.and(Not.not(a), c), Operation.and(b, Not.not(c))); - Expression y1 = Operation.or(Not.not(Operation.and(a, Not.not(b), c)), Operation.and(Not.not(a), c), Operation.and(b, Not.not(c)), Operation.and(b, Not.not(c))); - - Expression l = Operation.and(y, y1, a); - - Builder builder = new Builder(new ShapeFactory(new ElementLibrary())); - - Circuit circuit = builder - .addExpression("L", l) - .addExpression("Y", y) - .createCircuit(); - SwingUtilities.invokeLater(() -> new Main(null, circuit).setVisible(true)); - } - } diff --git a/src/main/java/de/neemann/digital/draw/builder/Fragment.java b/src/main/java/de/neemann/digital/draw/builder/Fragment.java index 59430104b..429126aa4 100644 --- a/src/main/java/de/neemann/digital/draw/builder/Fragment.java +++ b/src/main/java/de/neemann/digital/draw/builder/Fragment.java @@ -6,18 +6,43 @@ import de.neemann.digital.draw.graphics.Vector; import java.util.List; /** + * A fragemnt used to create a circuit from an expression + * * @author hneemann */ public interface Fragment { + /** + * Layouts this fragment + * + * @return the width and height of this fragment + */ Box doLayout(); + /** + * Sets the position of the fragment. + * Called during layout + * + * @param pos the position + */ void setPos(Vector pos); + /** + * Fragment is asked to add itself to the given circuit + * + * @param pos the absolute position of the fragment + * @param circuit the circuit + */ void addToCircuit(Vector pos, Circuit circuit); + /** + * @return the input positions of this fragment + */ List getInputs(); + /** + * @return the output positions of this fragment + */ List getOutputs(); } diff --git a/src/main/java/de/neemann/digital/draw/builder/FragmentExpression.java b/src/main/java/de/neemann/digital/draw/builder/FragmentExpression.java index 174b0c7e1..ac2e3c15e 100644 --- a/src/main/java/de/neemann/digital/draw/builder/FragmentExpression.java +++ b/src/main/java/de/neemann/digital/draw/builder/FragmentExpression.java @@ -25,10 +25,22 @@ public class FragmentExpression implements Fragment { return f; } + /** + * Creates a new instance + * + * @param fragment a single frgment as an input + * @param merger the merger + */ public FragmentExpression(Fragment fragment, Fragment merger) { this(createList(fragment), merger); } + /** + * The list of fragments is merged by a merger to a single output + * + * @param frags the fragments to merge + * @param merger the merger + */ public FragmentExpression(ArrayList frags, Fragment merger) { this.merger = merger; fragments = new ArrayList<>(); diff --git a/src/main/java/de/neemann/digital/draw/builder/FragmentVisualElement.java b/src/main/java/de/neemann/digital/draw/builder/FragmentVisualElement.java index ac3e54a42..2e1ec163b 100644 --- a/src/main/java/de/neemann/digital/draw/builder/FragmentVisualElement.java +++ b/src/main/java/de/neemann/digital/draw/builder/FragmentVisualElement.java @@ -16,6 +16,8 @@ import java.util.ArrayList; import java.util.List; /** + * A fragment describing a VisualElement + * * @author hneemann */ public class FragmentVisualElement implements Fragment { @@ -25,10 +27,23 @@ public class FragmentVisualElement implements Fragment { private final VisualElement visualElement; private Vector pos; + /** + * Creates a new instance + * + * @param description the elements description + * @param shapeFactory the shapeFactory to use + */ public FragmentVisualElement(ElementTypeDescription description, ShapeFactory shapeFactory) { this(description, 1, shapeFactory); } + /** + * Creates a new instance + * + * @param description the elements description + * @param inputCount number of inputs + * @param shapeFactory the shapeFactory to use + */ public FragmentVisualElement(ElementTypeDescription description, int inputCount, ShapeFactory shapeFactory) { visualElement = new VisualElement(description.getName()).setShapeFactory(shapeFactory); visualElement.getElementAttributes().set(Keys.INPUT_COUNT, inputCount); @@ -44,6 +59,14 @@ public class FragmentVisualElement implements Fragment { } } + /** + * Sets an attribute to this VisualElement + * + * @param key the key + * @param value the value + * @param the tyype of the value + * @return this for call chaining + */ public FragmentVisualElement setAttr(Key key, VALUE value) { visualElement.getElementAttributes().set(key, value); return this; diff --git a/src/test/java/de/neemann/digital/draw/builder/BuilderTest.java b/src/test/java/de/neemann/digital/draw/builder/BuilderTest.java new file mode 100644 index 000000000..469f4366f --- /dev/null +++ b/src/test/java/de/neemann/digital/draw/builder/BuilderTest.java @@ -0,0 +1,42 @@ +package de.neemann.digital.draw.builder; + +import de.neemann.digital.TestExecuter; +import de.neemann.digital.analyse.expression.Expression; +import de.neemann.digital.analyse.expression.Variable; +import de.neemann.digital.draw.elements.Circuit; +import de.neemann.digital.draw.library.ElementLibrary; +import de.neemann.digital.draw.model.ModelDescription; +import de.neemann.digital.draw.shapes.ShapeFactory; +import junit.framework.TestCase; + +import static de.neemann.digital.analyse.expression.Not.not; +import static de.neemann.digital.analyse.expression.Operation.and; +import static de.neemann.digital.analyse.expression.Operation.or; + +/** + * @author hneemann + */ +public class BuilderTest extends TestCase { + + public void testBuilder() throws Exception { + + Variable a = new Variable("a"); + Variable b = new Variable("b"); + + // xor + Expression y = and(or(a, b), not(and(a, b))); + + ElementLibrary library = new ElementLibrary(); + Circuit circuit = new Builder(new ShapeFactory(library)) + .addExpression("y", y) + .createCircuit(); + + ModelDescription m = new ModelDescription(circuit, library); + + TestExecuter te = new TestExecuter(m.createModel(false)).setUp(m); + te.check(0, 0, 0); + te.check(0, 1, 1); + te.check(1, 0, 1); + te.check(1, 1, 0); + } +} \ No newline at end of file