diff --git a/src/main/dig/processor/Graphics.dig b/src/main/dig/processor/Graphics.dig
index 2537d8491..32d3cbc54 100644
--- a/src/main/dig/processor/Graphics.dig
+++ b/src/main/dig/processor/Graphics.dig
@@ -197,7 +197,7 @@
1,15
-
+
Out
@@ -312,12 +312,12 @@
-
+
-
+
diff --git a/src/main/java/de/neemann/digital/core/memory/DataField.java b/src/main/java/de/neemann/digital/core/memory/DataField.java
index 6545628a3..4c463f0ef 100644
--- a/src/main/java/de/neemann/digital/core/memory/DataField.java
+++ b/src/main/java/de/neemann/digital/core/memory/DataField.java
@@ -14,11 +14,10 @@ public class DataField {
/***
* Simple default data field
*/
- public static final DataField DEFAULT = new DataField(0, 8);
+ public static final DataField DEFAULT = new DataField(0);
private final int size;
private long[] data;
- private final int bits;
private final transient ArrayList listeners = new ArrayList<>();
@@ -26,16 +25,14 @@ public class DataField {
* Creates a new DataField
*
* @param size size
- * @param bits number of bits
*/
- public DataField(int size, int bits) {
- this(new long[size], size, bits);
+ public DataField(int size) {
+ this(new long[size], size);
}
- private DataField(long[] data, int size, int bits) {
+ private DataField(long[] data, int size) {
this.size = size;
this.data = data;
- this.bits = bits;
}
/**
@@ -44,10 +41,9 @@ public class DataField {
*
* @param dataField the data to use
* @param newSize new size
- * @param bits number og bits
*/
- public DataField(DataField dataField, int newSize, int bits) {
- this(Arrays.copyOf(dataField.data, newSize), newSize, bits);
+ public DataField(DataField dataField, int newSize) {
+ this(Arrays.copyOf(dataField.data, newSize), newSize);
}
/**
@@ -87,7 +83,6 @@ public class DataField {
}
size = pos;
}
- bits = 16;
}
/**
@@ -142,14 +137,7 @@ public class DataField {
if (pos == data.length)
return this;
else
- return new DataField(Arrays.copyOf(data, pos), size, bits);
- }
-
- /**
- * @return the number of bits
- */
- public int getBits() {
- return bits;
+ return new DataField(Arrays.copyOf(data, pos), size);
}
/**
diff --git a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java
index cd05679c5..aa84f2930 100644
--- a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java
+++ b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java
@@ -1,9 +1,6 @@
package de.neemann.digital.core.memory;
-import de.neemann.digital.core.Node;
-import de.neemann.digital.core.NodeException;
-import de.neemann.digital.core.ObservableValue;
-import de.neemann.digital.core.ObservableValues;
+import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@@ -36,13 +33,13 @@ public class RAMDualPort extends Node implements Element, RAMInterface {
private final DataField memory;
private final ObservableValue output;
- protected final int addrBits;
- protected final int bits;
- protected ObservableValue addrIn;
- protected ObservableValue dataIn;
- protected ObservableValue strIn;
- protected ObservableValue clkIn;
- protected ObservableValue ldIn;
+ private final int addrBits;
+ private final int bits;
+ private ObservableValue addrIn;
+ private ObservableValue dataIn;
+ private ObservableValue strIn;
+ private ObservableValue clkIn;
+ private ObservableValue ldIn;
private int addr;
private boolean lastClk = false;
private boolean ld;
@@ -57,7 +54,7 @@ public class RAMDualPort extends Node implements Element, RAMInterface {
bits = attr.get(Keys.BITS);
output = createOutput();
addrBits = attr.get(Keys.ADDR_BITS);
- memory = new DataField(1 << addrBits, bits);
+ memory = new DataField(1 << addrBits);
}
/**
@@ -71,11 +68,61 @@ public class RAMDualPort extends Node implements Element, RAMInterface {
@Override
public void setInputs(ObservableValues inputs) throws NodeException {
- addrIn = inputs.get(0).checkBits(addrBits, this).addObserverToValue(this);
- dataIn = inputs.get(1).checkBits(bits, this).addObserverToValue(this);
- strIn = inputs.get(2).checkBits(1, this).addObserverToValue(this);
- clkIn = inputs.get(3).checkBits(1, this).addObserverToValue(this);
- ldIn = inputs.get(4).checkBits(1, this).addObserverToValue(this);
+ setAddrIn(inputs.get(0));
+ setDataIn(inputs.get(1));
+ setStrIn(inputs.get(2));
+ setClkIn(inputs.get(3));
+ setLdIn(inputs.get(4));
+ }
+
+ /**
+ * Sets the addrIn input value
+ *
+ * @param addrIn addrIn
+ * @throws BitsException BitsException
+ */
+ protected void setAddrIn(ObservableValue addrIn) throws BitsException {
+ this.addrIn = addrIn.checkBits(addrBits, this).addObserverToValue(this);
+ }
+
+ /**
+ * Sets the dataIn input value
+ *
+ * @param dataIn dataIn
+ * @throws BitsException BitsException
+ */
+ protected void setDataIn(ObservableValue dataIn) throws BitsException {
+ this.dataIn = dataIn.checkBits(bits, this).addObserverToValue(this);
+ }
+
+ /**
+ * Sets the strIn input value
+ *
+ * @param strIn strIn
+ * @throws BitsException BitsException
+ */
+ protected void setStrIn(ObservableValue strIn) throws BitsException {
+ this.strIn = strIn.checkBits(1, this).addObserverToValue(this);
+ }
+
+ /**
+ * Sets the clkIn input value
+ *
+ * @param clkIn clkIn
+ * @throws BitsException BitsException
+ */
+ protected void setClkIn(ObservableValue clkIn) throws BitsException {
+ this.clkIn = clkIn.checkBits(1, this).addObserverToValue(this);
+ }
+
+ /**
+ * Sets the ldIn input value
+ *
+ * @param ldIn ldIn
+ * @throws BitsException BitsException
+ */
+ protected void setLdIn(ObservableValue ldIn) throws BitsException {
+ this.ldIn = ldIn.checkBits(1, this).addObserverToValue(this);
}
@Override
diff --git a/src/main/java/de/neemann/digital/core/memory/RAMSinglePort.java b/src/main/java/de/neemann/digital/core/memory/RAMSinglePort.java
index 33ed8b132..0567e8b5e 100644
--- a/src/main/java/de/neemann/digital/core/memory/RAMSinglePort.java
+++ b/src/main/java/de/neemann/digital/core/memory/RAMSinglePort.java
@@ -56,11 +56,11 @@ public class RAMSinglePort extends RAMDualPort {
@Override
public void setInputs(ObservableValues inputs) throws NodeException {
- addrIn = inputs.get(0).checkBits(addrBits, this).addObserverToValue(this);
- strIn = inputs.get(1).checkBits(1, this).addObserverToValue(this);
- clkIn = inputs.get(2).checkBits(1, this).addObserverToValue(this);
- ldIn = inputs.get(3).checkBits(1, this).addObserverToValue(this);
- dataIn = inputs.get(4).checkBits(bits, this).addObserverToValue(this); // additional input to read the port
+ setAddrIn(inputs.get(0));
+ setStrIn(inputs.get(1));
+ setClkIn(inputs.get(2));
+ setLdIn(inputs.get(3));
+ setDataIn(inputs.get(4)); // additional input to read the port
}
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/RAMShape.java b/src/main/java/de/neemann/digital/draw/shapes/RAMShape.java
index cd0e1c07a..a7fff483a 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/RAMShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/RAMShape.java
@@ -2,6 +2,8 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.Element;
+import de.neemann.digital.core.element.ElementAttributes;
+import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescriptions;
import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.core.memory.RAMInterface;
@@ -14,19 +16,24 @@ import java.awt.*;
/**
* The RAM shape
+ *
* @author hneemann
*/
public class RAMShape extends GenericShape {
+ private final int bits;
+ private final int size;
+
/**
* Creates a new instance
*
- * @param name name of the element
+ * @param attr the label to use
* @param inputs the inputs
* @param outputs the outputs
- * @param label the label to use
*/
- public RAMShape(String name, PinDescriptions inputs, PinDescriptions outputs, String label) {
- super(name, inputs, outputs, label, true);
+ public RAMShape(ElementAttributes attr, PinDescriptions inputs, PinDescriptions outputs) {
+ super("RAM", inputs, outputs, attr.getLabel(), true);
+ bits = attr.get(Keys.BITS);
+ size = 1 << attr.get(Keys.ADDR_BITS);
}
@Override
@@ -36,7 +43,7 @@ public class RAMShape extends GenericShape {
public boolean clicked(CircuitComponent cc, Point pos, IOState ioState, Element element, Sync modelSync) {
if (element instanceof RAMInterface) {
DataField dataField = ((RAMInterface) element).getMemory();
- new DataEditor(cc, dataField, modelSync).showDialog();
+ new DataEditor(cc, dataField, size, bits, true, modelSync).showDialog();
}
return false;
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
index f681cde83..cb8ec6be3 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
@@ -69,8 +69,8 @@ public final class ShapeFactory {
}
- map.put(RAMDualPort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape("RAM", RAMDualPort.DESCRIPTION.getInputDescription(attr), RAMDualPort.DESCRIPTION.getOutputDescriptions(attr), attr.getLabel()));
- map.put(RAMSinglePort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape("RAM", RAMSinglePort.DESCRIPTION.getInputDescription(attr), RAMSinglePort.DESCRIPTION.getOutputDescriptions(attr), attr.getLabel()));
+ map.put(RAMDualPort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RAMDualPort.DESCRIPTION.getInputDescription(attr), RAMDualPort.DESCRIPTION.getOutputDescriptions(attr)));
+ map.put(RAMSinglePort.DESCRIPTION.getName(), (attr, inputs, outputs) -> new RAMShape(attr, RAMSinglePort.DESCRIPTION.getInputDescription(attr), RAMSinglePort.DESCRIPTION.getOutputDescriptions(attr)));
map.put(In.DESCRIPTION.getName(), InputShape::new);
map.put(Reset.DESCRIPTION.getName(), ResetShape::new);
diff --git a/src/main/java/de/neemann/digital/gui/components/DataEditor.java b/src/main/java/de/neemann/digital/gui/components/DataEditor.java
index 4b6adbd1d..c785f09f7 100644
--- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java
+++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java
@@ -1,7 +1,5 @@
package de.neemann.digital.gui.components;
-import de.neemann.digital.core.element.ElementAttributes;
-import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.gui.sync.Sync;
import de.neemann.digital.lang.Lang;
@@ -24,7 +22,7 @@ import java.util.ArrayList;
* @author hneemann
*/
public class DataEditor extends JDialog {
- private final DataField dataField;
+ private final DataField localDataField;
private boolean ok = false;
/**
@@ -33,71 +31,44 @@ public class DataEditor extends JDialog {
* @param parent the parent
* @param dataField the data to edit
*/
- public DataEditor(JComponent parent, DataField dataField, Sync modelSync) {
- this(parent, dataField, null, modelSync);
- }
-
- /**
- * Creates a new instance
- *
- * @param parent the parent
- * @param dataField the data to edit
- * @param attr uset to get bit sizes
- */
- public DataEditor(JComponent parent, DataField dataField, ElementAttributes attr, Sync modelSync) {
- super(SwingUtilities.windowForComponent(parent), Lang.get("key_Data"), attr == null ? ModalityType.MODELESS : ModalityType.APPLICATION_MODAL);
+ public DataEditor(JComponent parent, DataField dataField, int size, int bits, boolean modelIsRunning, Sync modelSync) {
+ super(SwingUtilities.windowForComponent(parent), Lang.get("key_Data"), modelIsRunning ? ModalityType.MODELESS : ModalityType.APPLICATION_MODAL);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- int size;
- int bits;
- boolean register;
- if (attr != null) {
- bits = attr.getBits();
- if (attr.contains(Keys.ADDR_BITS))
- size = 1 << attr.get(Keys.ADDR_BITS);
- else
- size = 1 << attr.get(Keys.INPUT_COUNT);
-
- this.dataField = new DataField(dataField, size, bits);
- register = false;
- } else {
- this.dataField = dataField;
- size = this.dataField.size();
- bits = this.dataField.getBits();
- register = true;
- }
+ if (modelIsRunning)
+ localDataField = dataField;
+ else
+ localDataField = new DataField(dataField, size);
int cols = 16;
if (size <= 16) cols = 1;
else if (size <= 128) cols = 8;
- MyTableModel dm = new MyTableModel(this.dataField, cols, modelSync);
+ MyTableModel dm = new MyTableModel(this.localDataField, cols, modelSync);
JTable table = new JTable(dm);
table.setDefaultRenderer(MyLong.class, new MyLongRenderer(bits));
getContentPane().add(new JScrollPane(table));
- if (register) {
- this.dataField.addListener(dm);
-
+ if (modelIsRunning) {
+ dataField.addListener(dm);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
- DataEditor.this.dataField.removeListener(dm);
+ dataField.removeListener(dm);
}
});
+ } else {
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(new JButton(new AbstractAction(Lang.get("ok")) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ ok = true;
+ dispose();
+ }
+ }));
+ getContentPane().add(buttons, BorderLayout.SOUTH);
}
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(new JButton(new AbstractAction(Lang.get("ok")) {
- @Override
- public void actionPerformed(ActionEvent e) {
- ok = true;
- dispose();
- }
- }));
- getContentPane().add(buttons, BorderLayout.SOUTH);
-
setPreferredSize(new Dimension((cols + 1) * 50, getPreferredSize().height));
pack();
@@ -108,8 +79,8 @@ public class DataEditor extends JDialog {
/**
* @return the data field
*/
- public DataField getDataField() {
- return dataField;
+ public DataField getModifiedDataField() {
+ return localDataField;
}
/**
@@ -174,7 +145,7 @@ public class DataEditor extends JDialog {
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
- modelSync.access(()->{
+ modelSync.access(() -> {
dataField.setData(rowIndex * cols + (columnIndex - 1), ((MyLong) aValue).getValue());
});
}
diff --git a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
index 432ae3e34..0db9aa9a9 100644
--- a/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
+++ b/src/main/java/de/neemann/digital/gui/components/EditorFactory.java
@@ -2,6 +2,7 @@ package de.neemann.digital.gui.components;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Key;
+import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.Rotation;
import de.neemann.digital.core.io.IntFormat;
import de.neemann.digital.core.memory.DataField;
@@ -236,9 +237,11 @@ public final class EditorFactory {
panel.add(new ToolTipAction(Lang.get("btn_edit")) {
@Override
public void actionPerformed(ActionEvent e) {
- DataEditor de = new DataEditor(panel, data, attr, NoSync.INST);
+ int bits = attr.get(Keys.BITS);
+ int size = 1 << attr.get(Keys.ADDR_BITS);
+ DataEditor de = new DataEditor(panel, data, size, bits, false, NoSync.INST);
if (de.showDialog()) {
- data = de.getDataField();
+ data = de.getModifiedDataField();
}
}
}.createJButton());
diff --git a/src/main/java/de/neemann/digital/gui/components/graphics/GraphicCard.java b/src/main/java/de/neemann/digital/gui/components/graphics/GraphicCard.java
index 388a184f6..4da1d407f 100644
--- a/src/main/java/de/neemann/digital/gui/components/graphics/GraphicCard.java
+++ b/src/main/java/de/neemann/digital/gui/components/graphics/GraphicCard.java
@@ -67,7 +67,7 @@ public class GraphicCard extends Node implements Element, RAMInterface {
width = attr.get(Keys.GRAPHIC_WIDTH);
height = attr.get(Keys.GRAPHIC_HEIGHT);
bankSize = width * height;
- memory = new DataField(bankSize * 2, 8);
+ memory = new DataField(bankSize * 2);
dataOut = new ObservableValue("D", 16, true)
.setDescription(Lang.get("elem_RAMSinglePort_pin_d"))
diff --git a/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java b/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java
index 95c699d19..cbaed8761 100644
--- a/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java
+++ b/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java
@@ -10,7 +10,7 @@ import java.io.StringReader;
public class DataFieldTest extends TestCase {
public void testGetMinimized() throws Exception {
- DataField data = new DataField(100, 8);
+ DataField data = new DataField(100);
data.setData(9, 1);
data = data.getMinimized();
assertEquals(1, data.getDataWord(9));
@@ -19,7 +19,7 @@ public class DataFieldTest extends TestCase {
}
public void testGrow() throws Exception {
- DataField data = new DataField(100, 8);
+ DataField data = new DataField(100);
data.setData(9, 1);
data = data.getMinimized();
assertEquals(1, data.getDataWord(9));
diff --git a/src/test/java/de/neemann/digital/core/memory/LUTTest.java b/src/test/java/de/neemann/digital/core/memory/LUTTest.java
index 598f3d91e..c42247906 100644
--- a/src/test/java/de/neemann/digital/core/memory/LUTTest.java
+++ b/src/test/java/de/neemann/digital/core/memory/LUTTest.java
@@ -20,7 +20,7 @@ public class LUTTest extends TestCase {
ObservableValue c = new ObservableValue("c", 1);
Model model = new Model();
- DataField data = new DataField(8, 8);
+ DataField data = new DataField(8);
data.setData(3, 1);
data.setData(7, 1);
LookUpTable out = model.add(new LookUpTable(
diff --git a/src/test/java/de/neemann/digital/core/memory/ROMTest.java b/src/test/java/de/neemann/digital/core/memory/ROMTest.java
index 86d7a21cb..2e55dda25 100644
--- a/src/test/java/de/neemann/digital/core/memory/ROMTest.java
+++ b/src/test/java/de/neemann/digital/core/memory/ROMTest.java
@@ -19,7 +19,7 @@ public class ROMTest extends TestCase {
ObservableValue sel = new ObservableValue("sel", 1);
Model model = new Model();
- DataField data = new DataField(8, 8);
+ DataField data = new DataField(8);
data.setData(3, 17);
data.setData(7, 200);
ROM out = model.add(new ROM(