From 058bf2d9adc6176fbd1c3045a6eb71a0e24cba0b Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 8 Oct 2021 08:23:38 +0200 Subject: [PATCH] fixes #858 --- .../digital/analyse/ModelAnalyserInfo.java | 47 +++++++++++++++---- .../format/TruthTableFormatterTestCase.java | 25 +++++----- .../builder/circuit/CircuitBuilder.java | 12 ++--- .../digital/analyse/ModelAnalyserTest.java | 39 ++++++++------- .../neemann/digital/fsm/ValueParserTest.java | 8 ++-- 5 files changed, 78 insertions(+), 53 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyserInfo.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyserInfo.java index c4886955f..2c25171e3 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyserInfo.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyserInfo.java @@ -18,8 +18,8 @@ import java.util.TreeMap; */ public class ModelAnalyserInfo { private final String clockPin; - private final HashMap> inputBusMap; - private final HashMap> outputBusMap; + private final ArrayList inputBusList; + private final ArrayList outputBusList; private final HashMap initValueMap; private final boolean isSequential; private TreeMap pins; @@ -41,8 +41,8 @@ public class ModelAnalyserInfo { isSequential = model != null && !model.findNode(Node::hasState).isEmpty(); - inputBusMap = new HashMap<>(); - outputBusMap = new HashMap<>(); + inputBusList = new ArrayList<>(); + outputBusList = new ArrayList<>(); initValueMap = new HashMap<>(); } @@ -108,7 +108,7 @@ public class ModelAnalyserInfo { } void addInputBus(String name, ArrayList names) { - inputBusMap.put(name, names); + inputBusList.add(new Bus(name, names)); } /** @@ -118,21 +118,21 @@ public class ModelAnalyserInfo { * @param names the individual names in the truth table */ public void addOutputBus(String name, ArrayList names) { - outputBusMap.put(name, names); + outputBusList.add(new Bus(name, names)); } /** * @return input bus map */ - public HashMap> getInputBusMap() { - return inputBusMap; + public ArrayList getInputBusList() { + return inputBusList; } /** * @return output bus map */ - public HashMap> getOutputBusMap() { - return outputBusMap; + public ArrayList getOutputBusList() { + return outputBusList; } /** @@ -180,4 +180,31 @@ public class ModelAnalyserInfo { public void setStateSignalName(String stateSignalName) { this.stateSignalName = stateSignalName; } + + /** + * Description of a bus used as input or output of the circuit + */ + public static final class Bus { + private final String busName; + private final ArrayList signalNames; + + private Bus(String busName, ArrayList signalNames) { + this.busName = busName; + this.signalNames = signalNames; + } + + /** + * @return the name of the bus + */ + public String getBusName() { + return busName; + } + + /** + * @return list of names of the signals the bus is made of + */ + public ArrayList getSignalNames() { + return signalNames; + } + } } diff --git a/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java index f298601fb..1daa60eec 100644 --- a/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java +++ b/src/main/java/de/neemann/digital/analyse/format/TruthTableFormatterTestCase.java @@ -14,7 +14,6 @@ import de.neemann.digital.analyse.quinemc.ThreeStateValue; import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; /** * Creates a test case which represents the truth table @@ -22,8 +21,8 @@ import java.util.Map; public class TruthTableFormatterTestCase implements TruthTableFormatter { private enum Type {NORMAL, FIRSTBIN, BIN} - private final HashMap> inputBusMap; - private final HashMap> outputBusMap; + private final ArrayList inputBusList; + private final ArrayList outputBusList; /** * Creates a new instance. @@ -32,11 +31,11 @@ public class TruthTableFormatterTestCase implements TruthTableFormatter { */ public TruthTableFormatterTestCase(ModelAnalyserInfo modelAnalyzerInfo) { if (modelAnalyzerInfo == null) { - inputBusMap = new HashMap<>(); - outputBusMap = new HashMap<>(); + inputBusList = new ArrayList<>(); + outputBusList = new ArrayList<>(); } else { - inputBusMap = modelAnalyzerInfo.getInputBusMap(); - outputBusMap = modelAnalyzerInfo.getOutputBusMap(); + inputBusList = modelAnalyzerInfo.getInputBusList(); + outputBusList = modelAnalyzerInfo.getOutputBusList(); } } @@ -47,12 +46,12 @@ public class TruthTableFormatterTestCase implements TruthTableFormatter { ArrayList inputs = new ArrayList<>(); for (Variable v : truthTable.getVars()) inputs.add(v.getIdentifier()); - ArrayList inputOutType = outVars(sb, inputs, inputBusMap); + ArrayList inputOutType = outVars(sb, inputs, inputBusList); ArrayList outputs = new ArrayList<>(); for (int i = 0; i < truthTable.getResultCount(); i++) outputs.add(truthTable.getResultName(i)); - ArrayList outputOutType = outVars(sb, outputs, outputBusMap); + ArrayList outputOutType = outVars(sb, outputs, outputBusList); sb.append("\n\n"); @@ -86,16 +85,16 @@ public class TruthTableFormatterTestCase implements TruthTableFormatter { } - private ArrayList outVars(StringBuilder sb, ArrayList vars, HashMap> busMap) { + private ArrayList outVars(StringBuilder sb, ArrayList vars, ArrayList busList) { ArrayList types = new ArrayList<>(vars.size()); HashMap map = new HashMap<>(); - for (Map.Entry> e : busMap.entrySet()) { + for (ModelAnalyserInfo.Bus b : busList) { String last = null; - for (String s : e.getValue()) { + for (String s : b.getSignalNames()) { map.put(s, ""); last = s; } - map.put(last, e.getKey()); + map.put(last, b.getBusName()); } for (String n : vars) { String r = map.get(n); diff --git a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java index e83e89be0..2230e18a3 100644 --- a/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java +++ b/src/main/java/de/neemann/digital/builder/circuit/CircuitBuilder.java @@ -517,10 +517,10 @@ public class CircuitBuilder implements BuilderInterface { private void checkForInputBus(Collection variables, int splitterXPos, Circuit circuit) { StringBuilder pinString = new StringBuilder(); int y = 0; - for (Map.Entry> e : mai.getInputBusMap().entrySet()) { + for (ModelAnalyserInfo.Bus b : mai.getInputBusList()) { pinString.setLength(0); int found = 0; - final ArrayList inputs = e.getValue(); + final ArrayList inputs = b.getSignalNames(); for (String n : inputs) { if (variables.contains(new Variable(n))) { found++; @@ -541,7 +541,7 @@ public class CircuitBuilder implements BuilderInterface { .setPos(new Vector(splitterXPos, y)) .setShapeFactory(shapeFactory)); circuit.add(new VisualElement(In.DESCRIPTION.getName()) - .setAttribute(Keys.LABEL, e.getKey()) + .setAttribute(Keys.LABEL, b.getBusName()) .setAttribute(Keys.BITS, inputs.size()) .setAttribute(Keys.PINNUMBER, pinString.toString()) .setPos(new Vector(splitterXPos - 2 * SIZE, y)) @@ -570,10 +570,10 @@ public class CircuitBuilder implements BuilderInterface { private int checkForOutputBus(int splitterXPos, Circuit circuit) { StringBuilder pinString = new StringBuilder(); int y = 0; - for (Map.Entry> e : mai.getOutputBusMap().entrySet()) { + for (ModelAnalyserInfo.Bus b : mai.getOutputBusList()) { pinString.setLength(0); int found = 0; - final ArrayList outputs = e.getValue(); + final ArrayList outputs = b.getSignalNames(); for (String n : outputs) { if (combinatorialOutputs.containsKey(n)) { found++; @@ -593,7 +593,7 @@ public class CircuitBuilder implements BuilderInterface { .setPos(new Vector(splitterXPos, y)) .setShapeFactory(shapeFactory)); circuit.add(new VisualElement(Out.DESCRIPTION.getName()) - .setAttribute(Keys.LABEL, e.getKey()) + .setAttribute(Keys.LABEL, b.getBusName()) .setAttribute(Keys.BITS, outputs.size()) .setAttribute(Keys.PINNUMBER, pinString.toString()) .setPos(new Vector(splitterXPos + 3 * SIZE, y)) diff --git a/src/test/java/de/neemann/digital/analyse/ModelAnalyserTest.java b/src/test/java/de/neemann/digital/analyse/ModelAnalyserTest.java index 33d31a540..0cdb9e1f6 100644 --- a/src/test/java/de/neemann/digital/analyse/ModelAnalyserTest.java +++ b/src/test/java/de/neemann/digital/analyse/ModelAnalyserTest.java @@ -24,13 +24,13 @@ import junit.framework.TestCase; import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.TreeMap; import static de.neemann.digital.analyse.quinemc.ThreeStateValue.one; import static de.neemann.digital.analyse.quinemc.ThreeStateValue.zero; /** + * */ public class ModelAnalyserTest extends TestCase { @@ -161,25 +161,25 @@ public class ModelAnalyserTest extends TestCase { public void testAnalyzerUniqueNames2() throws Exception { Model model = createModel("dig/analyze/uniqueNames2.dig"); ArrayList ins = new ModelAnalyser(model).getInputs(); - assertEquals(2,ins.size()); - assertEquals("Q_0n",ins.get(0).getName()); - assertEquals("Q_01n",ins.get(1).getName()); + assertEquals(2, ins.size()); + assertEquals("Q_0n", ins.get(0).getName()); + assertEquals("Q_01n", ins.get(1).getName()); } public void testAnalyzerUniqueNames3() throws Exception { Model model = createModel("dig/analyze/uniqueNames3.dig"); ArrayList ins = new ModelAnalyser(model).getInputs(); - assertEquals(2,ins.size()); - assertEquals("Z^n",ins.get(0).getName()); - assertEquals("Z_1^n",ins.get(1).getName()); + assertEquals(2, ins.size()); + assertEquals("Z^n", ins.get(0).getName()); + assertEquals("Z_1^n", ins.get(1).getName()); } public void testAnalyzerUniqueNames4() throws Exception { Model model = createModel("dig/analyze/uniqueNames4.dig"); ArrayList ins = new ModelAnalyser(model).getInputs(); - assertEquals(2,ins.size()); - assertEquals("B^n",ins.get(0).getName()); - assertEquals("A^n",ins.get(1).getName()); + assertEquals(2, ins.size()); + assertEquals("B^n", ins.get(0).getName()); + assertEquals("A^n", ins.get(1).getName()); } public void testAnalyzerMultiBit() throws Exception { @@ -269,20 +269,19 @@ public class ModelAnalyserTest extends TestCase { Model model = createModel("dig/analyze/multiBitInOutXOr.dig"); ModelAnalyserInfo mai = new ModelAnalyser(model).analyse().getModelAnalyzerInfo(); - assertEquals(2, mai.getInputBusMap().size()); - checkBus(mai.getInputBusMap(), "A", "A_0", "A_1", "A_2", "A_3"); - checkBus(mai.getInputBusMap(), "B", "B_0", "B_1", "B_2", "B_3"); + assertEquals(2, mai.getInputBusList().size()); + checkBus(mai.getInputBusList().get(0), "A", "A_0", "A_1", "A_2", "A_3"); + checkBus(mai.getInputBusList().get(1), "B", "B_0", "B_1", "B_2", "B_3"); - assertEquals(1, mai.getOutputBusMap().size()); - checkBus(mai.getOutputBusMap(), "S", "S_0", "S_1", "S_2", "S_3"); + assertEquals(1, mai.getOutputBusList().size()); + checkBus(mai.getOutputBusList().get(0), "S", "S_0", "S_1", "S_2", "S_3"); } - private void checkBus(HashMap> busMap, String name, String... names) { - ArrayList n = busMap.get(name); - assertNotNull(n); - assertEquals(names.length, n.size()); + private void checkBus(ModelAnalyserInfo.Bus bus, String name, String... names) { + assertEquals(name, bus.getBusName()); + assertEquals(names.length, bus.getSignalNames().size()); for (int i = 0; i < names.length; i++) - assertEquals(names[i], n.get(i)); + assertEquals(names[i], bus.getSignalNames().get(i)); } } diff --git a/src/test/java/de/neemann/digital/fsm/ValueParserTest.java b/src/test/java/de/neemann/digital/fsm/ValueParserTest.java index f43eaca89..0c3e31545 100644 --- a/src/test/java/de/neemann/digital/fsm/ValueParserTest.java +++ b/src/test/java/de/neemann/digital/fsm/ValueParserTest.java @@ -9,7 +9,6 @@ import de.neemann.digital.analyse.ModelAnalyserInfo; import junit.framework.TestCase; import java.util.ArrayList; -import java.util.HashMap; import java.util.TreeMap; public class ValueParserTest extends TestCase { @@ -38,10 +37,11 @@ public class ValueParserTest extends TestCase { ModelAnalyserInfo mai = new ModelAnalyserInfo(null); TreeMap v = new ValueParser("A=1101").setModelAnalyzerInfo(mai).parse(); assertEquals(4, v.size()); - HashMap> om = mai.getOutputBusMap(); + ArrayList om = mai.getOutputBusList(); assertEquals(1, om.size()); - ArrayList list = om.get("A"); - assertNotNull(list); + ModelAnalyserInfo.Bus bus = om.get(0); + assertEquals("A", bus.getBusName()); + ArrayList list = bus.getSignalNames(); assertEquals(4, list.size()); assertEquals("A0", list.get(0)); assertEquals("A1", list.get(1));