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 47af8b1cd..f8ee4e1f7 100644 --- a/src/main/java/de/neemann/digital/core/memory/DataField.java +++ b/src/main/java/de/neemann/digital/core/memory/DataField.java @@ -114,7 +114,7 @@ public class DataField { * @param addr the address * @return the value */ - public long getData(int addr) { + public long getDataWord(int addr) { if (addr >= data.length) return 0; else diff --git a/src/main/java/de/neemann/digital/core/memory/LookUpTable.java b/src/main/java/de/neemann/digital/core/memory/LookUpTable.java index 72db49672..cf8b95d6c 100644 --- a/src/main/java/de/neemann/digital/core/memory/LookUpTable.java +++ b/src/main/java/de/neemann/digital/core/memory/LookUpTable.java @@ -74,7 +74,7 @@ public class LookUpTable extends Node implements Element { @Override public void writeOutputs() throws NodeException { - output.setValue(data.getData(addr)); + output.setValue(data.getDataWord(addr)); } } 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 83a0be000..bba2400d1 100644 --- a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java +++ b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java @@ -105,7 +105,7 @@ public class RAMDualPort extends Node implements Element, RAMInterface { @Override public void writeOutputs() throws NodeException { if (ld) { - output.set(memory.getData(addr), false); + output.set(memory.getDataWord(addr), false); } else { output.setHighZ(true); } diff --git a/src/main/java/de/neemann/digital/core/memory/ROM.java b/src/main/java/de/neemann/digital/core/memory/ROM.java index f612ab649..a32447ad7 100644 --- a/src/main/java/de/neemann/digital/core/memory/ROM.java +++ b/src/main/java/de/neemann/digital/core/memory/ROM.java @@ -87,7 +87,7 @@ public class ROM extends Node implements Element { @Override public void writeOutputs() throws NodeException { - output.set(data.getData(addr), !sel); + output.set(data.getDataWord(addr), !sel); } /** 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 4e940495e..88994fb42 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -144,7 +144,7 @@ public class DataEditor extends JDialog { if (columnIndex == 0) { return new MyLong((long) rowIndex * cols); } - return new MyLong(dataField.getData(rowIndex * cols + (columnIndex - 1))); + return new MyLong(dataField.getDataWord(rowIndex * cols + (columnIndex - 1))); } @Override 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 f5851abbe..95c699d19 100644 --- a/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java +++ b/src/test/java/de/neemann/digital/core/memory/DataFieldTest.java @@ -13,27 +13,27 @@ public class DataFieldTest extends TestCase { DataField data = new DataField(100, 8); data.setData(9, 1); data = data.getMinimized(); - assertEquals(1, data.getData(9)); + assertEquals(1, data.getDataWord(9)); data = data.getMinimized(); - assertEquals(1, data.getData(9)); + assertEquals(1, data.getDataWord(9)); } public void testGrow() throws Exception { DataField data = new DataField(100, 8); data.setData(9, 1); data = data.getMinimized(); - assertEquals(1, data.getData(9)); + assertEquals(1, data.getDataWord(9)); data.setData(30, 1); - assertEquals(1, data.getData(30)); + assertEquals(1, data.getDataWord(30)); } public void testLoad() throws Exception { String data = "v2.0 raw\n0\n10\nAA\nFF"; DataField df = new DataField(new StringReader(data)); assertEquals(4, df.size()); - assertEquals(0x00, df.getData(0)); - assertEquals(0x10, df.getData(1)); - assertEquals(0xAA, df.getData(2)); - assertEquals(0xFF, df.getData(3)); + assertEquals(0x00, df.getDataWord(0)); + assertEquals(0x10, df.getDataWord(1)); + assertEquals(0xAA, df.getDataWord(2)); + assertEquals(0xFF, df.getDataWord(3)); } } \ No newline at end of file diff --git a/src/test/java/de/neemann/digital/integration/TestProcessor.java b/src/test/java/de/neemann/digital/integration/TestProcessor.java deleted file mode 100644 index ccfe7f4e8..000000000 --- a/src/test/java/de/neemann/digital/integration/TestProcessor.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.neemann.digital.integration; - -import de.neemann.digital.core.Model; -import de.neemann.digital.core.NodeException; -import de.neemann.digital.core.memory.DataField; -import de.neemann.digital.core.memory.RAMSinglePort; -import de.neemann.digital.draw.elements.Circuit; -import de.neemann.digital.draw.elements.PinException; -import de.neemann.digital.draw.library.ElementLibrary; -import de.neemann.digital.draw.model.ModelDescription; -import de.neemann.digital.draw.shapes.ShapeFactory; -import de.neemann.digital.gui.LibrarySelector; -import junit.framework.TestCase; - -import java.io.File; -import java.io.IOException; -import java.util.List; - -/** - * @author hneemann - */ -public class TestProcessor extends TestCase { - - private Model createModel(String file) throws IOException, PinException, NodeException { - File filename = new File(Resources.getRoot(), file); - ElementLibrary library = new ElementLibrary(); - ShapeFactory shapeFactory = new ShapeFactory(library); - Circuit circuit = Circuit.loadCircuit(filename, shapeFactory); - LibrarySelector librarySelector = new LibrarySelector(library, shapeFactory, null); - librarySelector.setFilePath(filename.getParentFile()); - - ModelDescription md = new ModelDescription(circuit, library); - Model model = md.createModel(); - model.init(true); - - assertTrue(model.isFastRunModel()); - return model; - } - - /** - * Loads a simulated processor, which has already stored machine program that calculates the 15th - * fibonacci number with a simple recursive algorithm. The result (610) is stored in the first RAM word. - * - * @throws IOException IOException - * @throws NodeException NodeException - * @throws PinException PinException - */ - public void testFibonacci() throws IOException, NodeException, PinException { - Model model = createModel("dig/processor/Processor_fibonacci.dig"); - - assertEquals(98644, model.runToBreak()); // checks the number of cycles needed to calculate 610 - - List ramList = model.findNode(RAMSinglePort.class); - assertEquals(1, ramList.size()); - - DataField ram = ramList.get(0).getMemory(); // the rams content - assertEquals(610, ram.getData(0)); - } - - -} diff --git a/src/test/java/de/neemann/digital/integration/TestRunToBreak.java b/src/test/java/de/neemann/digital/integration/TestRunToBreak.java index 9c5378ee8..259f1ed18 100644 --- a/src/test/java/de/neemann/digital/integration/TestRunToBreak.java +++ b/src/test/java/de/neemann/digital/integration/TestRunToBreak.java @@ -1,34 +1,45 @@ package de.neemann.digital.integration; -import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; -import de.neemann.digital.draw.elements.Circuit; +import de.neemann.digital.core.memory.RAMSinglePort; +import de.neemann.digital.core.memory.Register; import de.neemann.digital.draw.elements.PinException; -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 java.io.File; import java.io.IOException; /** * @author hneemann */ public class TestRunToBreak extends TestCase { - private ElementLibrary library = new ElementLibrary(); public void testRunToBreak() throws IOException, NodeException, PinException { - File filename = new File(Resources.getRoot(), "dig/runToBreak.dig"); - Circuit circuit = Circuit.loadCircuit(filename, new ShapeFactory(new ElementLibrary())); + new ToBreakRunner("dig/runToBreak.dig") + .runToBreak(511); + } - ModelDescription md = new ModelDescription(circuit, library); - Model model = md.createModel(); - model.init(true); + public void testCounterSplitter() throws IOException, NodeException, PinException { + Register r = new ToBreakRunner("dig/CounterSplitter.dig") + .runToBreak(2047) + .getSingleNode(Register.class); - assertTrue(model.isFastRunModel()); - int halfClocks = model.runToBreak(); - assertEquals(511, halfClocks); + assertEquals(0x3ff, r.getOutputs()[0].getValue()); + } + + /** + * Loads a simulated processor, which has already stored a machine program that calculates the 15th + * fibonacci number with a simple recursive algorithm. The result (610) is stored in the first RAM word. + * + * @throws IOException IOException + * @throws NodeException NodeException + * @throws PinException PinException + */ + public void testFibonacci() throws IOException, NodeException, PinException { + RAMSinglePort ram = new ToBreakRunner("dig/processor/Processor_fibonacci.dig") + .runToBreak(98644) + .getSingleNode(RAMSinglePort.class); + + assertEquals(610, ram.getMemory().getDataWord(0)); } } diff --git a/src/test/java/de/neemann/digital/integration/ToBreakRunner.java b/src/test/java/de/neemann/digital/integration/ToBreakRunner.java new file mode 100644 index 000000000..9b51c12bb --- /dev/null +++ b/src/test/java/de/neemann/digital/integration/ToBreakRunner.java @@ -0,0 +1,52 @@ +package de.neemann.digital.integration; + +import de.neemann.digital.core.Model; +import de.neemann.digital.core.Node; +import de.neemann.digital.core.NodeException; +import de.neemann.digital.draw.elements.Circuit; +import de.neemann.digital.draw.elements.PinException; +import de.neemann.digital.draw.library.ElementLibrary; +import de.neemann.digital.draw.model.ModelDescription; +import de.neemann.digital.draw.shapes.ShapeFactory; +import de.neemann.digital.gui.LibrarySelector; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author hneemann + */ +public class ToBreakRunner { + + private final Model model; + + public ToBreakRunner(String file) throws IOException, PinException, NodeException { + File filename = new File(Resources.getRoot(), file); + ElementLibrary library = new ElementLibrary(); + ShapeFactory shapeFactory = new ShapeFactory(library); + Circuit circuit = Circuit.loadCircuit(filename, shapeFactory); + LibrarySelector librarySelector = new LibrarySelector(library, shapeFactory, null); + librarySelector.setFilePath(filename.getParentFile()); + + ModelDescription md = new ModelDescription(circuit, library); + model = md.createModel(); + model.init(true); + + assertTrue(model.isFastRunModel()); + } + + public ToBreakRunner runToBreak(int steps) throws NodeException { + assertEquals(steps, model.runToBreak()); + return this; + } + + public T getSingleNode(Class clazz) { + List nodes = model.findNode(clazz); + assertEquals(1, nodes.size()); + return nodes.get(0); + } +} diff --git a/src/test/resources/dig/CounterSplitter.dig b/src/test/resources/dig/CounterSplitter.dig new file mode 100644 index 000000000..eaeb193f8 --- /dev/null +++ b/src/test/resources/dig/CounterSplitter.dig @@ -0,0 +1,203 @@ + + + 1 + + + Clock + + + 0 + + + Counter + + + Bits + 5 + + + + 0 + + + Const + + + Value + 0 + + + + 0 + + + Counter + + + Bits + 5 + + + + 0 + + + Splitter + + + Input Splitting + 5,5 + + + Output Splitting + 10 + + + + 0 + + + Break + + + 0 + + + Register + + + Bits + 10 + + + + 0 + + + Out + + + Bits + 10 + + + + 0 + + + Const + + + Value + 0 + + + + 0 + + + Not + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file