From c95ec22fef92c2fdc29a835559e711cc30f99cf1 Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 18 Mar 2016 22:50:13 +0100 Subject: [PATCH] added a delay --- .../de/neemann/digital/core/wiring/Delay.java | 57 +++++++++++++++++++ .../java/de/neemann/digital/gui/Main.java | 3 +- .../digital/gui/draw/library/PartLibrary.java | 2 + .../digital/gui/draw/parts/Circuit.java | 4 ++ .../digital/gui/draw/shapes/OutputShape.java | 2 +- .../digital/gui/draw/shapes/ShapeFactory.java | 2 + 6 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/neemann/digital/core/wiring/Delay.java diff --git a/src/main/java/de/neemann/digital/core/wiring/Delay.java b/src/main/java/de/neemann/digital/core/wiring/Delay.java new file mode 100644 index 000000000..2a6afbc67 --- /dev/null +++ b/src/main/java/de/neemann/digital/core/wiring/Delay.java @@ -0,0 +1,57 @@ +package de.neemann.digital.core.wiring; + +import de.neemann.digital.core.BitsException; +import de.neemann.digital.core.Node; +import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.part.AttributeKey; +import de.neemann.digital.core.part.Part; +import de.neemann.digital.core.part.PartAttributes; +import de.neemann.digital.core.part.PartTypeDescription; + +/** + * @author hneemann + */ +public class Delay extends Node implements Part { + + public static final PartTypeDescription DESCRIPTION = new PartTypeDescription(Delay.class, "in"); + + private final ObservableValue output; + private final int bits; + private ObservableValue input; + private long value; + + public Delay(PartAttributes attributes) { + bits = attributes.get(AttributeKey.Bits); + output = new ObservableValue("out", bits); + } + + @Override + public void readInputs() throws NodeException { + value = input.getValue(); + } + + @Override + public void writeOutputs() throws NodeException { + output.setValue(value); + } + + public ObservableValue getOutput() { + return output; + } + + @Override + public void setInputs(ObservableValue... inputs) throws NodeException { + input = inputs[0]; + input.addListener(this); + + if (input.getBits() != bits) + throw new BitsException("wrongBitCountInDelay", input, output); + } + + @Override + public ObservableValue[] getOutputs() { + return new ObservableValue[]{output}; + } + +} diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 19d32156a..6363ec087 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -41,7 +41,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { public Main() { super("Digital"); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); Circuit cr = new Circuit(); @@ -230,6 +230,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { try (FileWriter out = new FileWriter(filename)) { xStream.marshal(circuitComponent.getCircuit(), new PrettyPrintWriter(out)); setFilename(filename); + circuitComponent.getCircuit().saved(); } catch (IOException e) { new ErrorMessage("error writing a file").addCause(e).show(); } diff --git a/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java b/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java index 310ed901e..09835e9be 100644 --- a/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java +++ b/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java @@ -13,6 +13,7 @@ import de.neemann.digital.core.io.In; import de.neemann.digital.core.io.LED; import de.neemann.digital.core.io.Out; import de.neemann.digital.core.part.PartTypeDescription; +import de.neemann.digital.core.wiring.Delay; import java.util.ArrayList; import java.util.HashMap; @@ -34,6 +35,7 @@ public class PartLibrary implements Iterable { add(XOr.DESCRIPTION, "Logic"); add(XNOr.DESCRIPTION, "Logic"); add(Not.DESCRIPTION, "Logic"); + add(Delay.DESCRIPTION, "Logic"); add(In.DESCRIPTION, "IO"); add(Out.DESCRIPTION, "IO"); diff --git a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java index 8d49fd793..fade7631f 100644 --- a/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java +++ b/src/main/java/de/neemann/digital/gui/draw/parts/Circuit.java @@ -116,4 +116,8 @@ public class Circuit implements Drawable { public boolean isModified() { return modified; } + + public void saved() { + modified = false; + } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java index c2a583b3f..4100a28c8 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/OutputShape.java @@ -60,7 +60,7 @@ public class OutputShape implements Shape { Vector center = new Vector(2 + SIZE, 0); graphic.drawCircle(center.sub(RAD), center.add(RAD), style); graphic.drawCircle(center.sub(RADL), center.add(RADL), Style.NORMAL); - Vector textPos = new Vector(SIZE * 3, 0); + Vector textPos = new Vector(SIZE * 2 + 3, 0); graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.LEFTCENTER, Style.NORMAL); } } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java index d53d7275a..78b3b7750 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java @@ -12,6 +12,7 @@ import de.neemann.digital.core.io.Out; import de.neemann.digital.core.part.AttributeKey; import de.neemann.digital.core.part.PartAttributes; import de.neemann.digital.core.part.PartTypeDescription; +import de.neemann.digital.core.wiring.Delay; import de.neemann.digital.gui.draw.library.PartLibrary; import java.util.HashMap; @@ -30,6 +31,7 @@ public final class ShapeFactory { map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true)); map.put(NOr.DESCRIPTION.getName(), new CreatorSimple("\u22651", NOr.DESCRIPTION, true)); map.put(Not.DESCRIPTION.getName(), new CreatorSimple("", Not.DESCRIPTION, true)); + map.put(Delay.DESCRIPTION.getName(), new CreatorSimple("", Delay.DESCRIPTION, false)); map.put(XOr.DESCRIPTION.getName(), new CreatorSimple("=1", XOr.DESCRIPTION, false)); map.put(XNOr.DESCRIPTION.getName(), new CreatorSimple("=1", XNOr.DESCRIPTION, true));