added a delay

This commit is contained in:
hneemann 2016-03-18 22:50:13 +01:00
parent 1b0d26cbf4
commit c95ec22fef
6 changed files with 68 additions and 2 deletions

View File

@ -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};
}
}

View File

@ -41,7 +41,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
public Main() { public Main() {
super("Digital"); super("Digital");
setDefaultCloseOperation(DISPOSE_ON_CLOSE); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
Circuit cr = new Circuit(); Circuit cr = new Circuit();
@ -230,6 +230,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
try (FileWriter out = new FileWriter(filename)) { try (FileWriter out = new FileWriter(filename)) {
xStream.marshal(circuitComponent.getCircuit(), new PrettyPrintWriter(out)); xStream.marshal(circuitComponent.getCircuit(), new PrettyPrintWriter(out));
setFilename(filename); setFilename(filename);
circuitComponent.getCircuit().saved();
} catch (IOException e) { } catch (IOException e) {
new ErrorMessage("error writing a file").addCause(e).show(); new ErrorMessage("error writing a file").addCause(e).show();
} }

View File

@ -13,6 +13,7 @@ import de.neemann.digital.core.io.In;
import de.neemann.digital.core.io.LED; import de.neemann.digital.core.io.LED;
import de.neemann.digital.core.io.Out; import de.neemann.digital.core.io.Out;
import de.neemann.digital.core.part.PartTypeDescription; import de.neemann.digital.core.part.PartTypeDescription;
import de.neemann.digital.core.wiring.Delay;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -34,6 +35,7 @@ public class PartLibrary implements Iterable<PartLibrary.PartContainer> {
add(XOr.DESCRIPTION, "Logic"); add(XOr.DESCRIPTION, "Logic");
add(XNOr.DESCRIPTION, "Logic"); add(XNOr.DESCRIPTION, "Logic");
add(Not.DESCRIPTION, "Logic"); add(Not.DESCRIPTION, "Logic");
add(Delay.DESCRIPTION, "Logic");
add(In.DESCRIPTION, "IO"); add(In.DESCRIPTION, "IO");
add(Out.DESCRIPTION, "IO"); add(Out.DESCRIPTION, "IO");

View File

@ -116,4 +116,8 @@ public class Circuit implements Drawable {
public boolean isModified() { public boolean isModified() {
return modified; return modified;
} }
public void saved() {
modified = false;
}
} }

View File

@ -60,7 +60,7 @@ public class OutputShape implements Shape {
Vector center = new Vector(2 + SIZE, 0); Vector center = new Vector(2 + SIZE, 0);
graphic.drawCircle(center.sub(RAD), center.add(RAD), style); graphic.drawCircle(center.sub(RAD), center.add(RAD), style);
graphic.drawCircle(center.sub(RADL), center.add(RADL), Style.NORMAL); 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); graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.LEFTCENTER, Style.NORMAL);
} }
} }

View File

@ -12,6 +12,7 @@ import de.neemann.digital.core.io.Out;
import de.neemann.digital.core.part.AttributeKey; import de.neemann.digital.core.part.AttributeKey;
import de.neemann.digital.core.part.PartAttributes; import de.neemann.digital.core.part.PartAttributes;
import de.neemann.digital.core.part.PartTypeDescription; import de.neemann.digital.core.part.PartTypeDescription;
import de.neemann.digital.core.wiring.Delay;
import de.neemann.digital.gui.draw.library.PartLibrary; import de.neemann.digital.gui.draw.library.PartLibrary;
import java.util.HashMap; import java.util.HashMap;
@ -30,6 +31,7 @@ public final class ShapeFactory {
map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true)); map.put(NAnd.DESCRIPTION.getName(), new CreatorSimple("&", NAnd.DESCRIPTION, true));
map.put(NOr.DESCRIPTION.getName(), new CreatorSimple("\u22651", NOr.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(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(XOr.DESCRIPTION.getName(), new CreatorSimple("=1", XOr.DESCRIPTION, false));
map.put(XNOr.DESCRIPTION.getName(), new CreatorSimple("=1", XNOr.DESCRIPTION, true)); map.put(XNOr.DESCRIPTION.getName(), new CreatorSimple("=1", XNOr.DESCRIPTION, true));