From fa6fc4dd7e5a070efd0697d3790ccef9639561dd Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 17 Mar 2017 17:00:21 +0100 Subject: [PATCH] pin assignment is stored in truth table now --- .../digital/analyse/ModelAnalyser.java | 5 +++ .../neemann/digital/analyse/TruthTable.java | 23 +++++++++++ .../de/neemann/digital/builder/PinMap.java | 41 +------------------ .../java/de/neemann/digital/core/Signal.java | 27 ++++++++++++ .../java/de/neemann/digital/gui/Main.java | 5 +-- .../gui/components/table/TableDialog.java | 16 +------- .../neemann/digital/builder/PinMapTest.java | 23 +---------- 7 files changed, 61 insertions(+), 79 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java index a4bf4161a..a0e1785f5 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java @@ -136,6 +136,11 @@ public class ModelAnalyser { for (Signal s : inputs) tt.addVariable(s.getName()); + for (Signal s : inputs) + tt.addPinNumber(s); + for (Signal s : outputs) + tt.addPinNumber(s); + ArrayList data = new ArrayList<>(); for (Signal s : outputs) { BoolTableByteArray e = new BoolTableByteArray(rows); diff --git a/src/main/java/de/neemann/digital/analyse/TruthTable.java b/src/main/java/de/neemann/digital/analyse/TruthTable.java index 882ff047b..db1ae8df1 100644 --- a/src/main/java/de/neemann/digital/analyse/TruthTable.java +++ b/src/main/java/de/neemann/digital/analyse/TruthTable.java @@ -10,9 +10,12 @@ import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.quinemc.BoolTable; import de.neemann.digital.analyse.quinemc.BoolTableByteArray; import de.neemann.digital.analyse.quinemc.ThreeStateValue; +import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.Signal; import java.io.*; import java.util.ArrayList; +import java.util.TreeMap; /** * The description of a truth table. @@ -23,6 +26,7 @@ public class TruthTable { private final ArrayList variables; private final ArrayList results; + private final TreeMap pins; private transient BitSetter bitSetter; /** @@ -123,6 +127,7 @@ public class TruthTable { public TruthTable(ArrayList vars) { this.variables = vars; results = new ArrayList<>(); + pins = new TreeMap<>(); } /** @@ -425,6 +430,24 @@ public class TruthTable { } } + /** + * Ats the signals pindescription to the table + * + * @param s the signal + * @throws NodeException NodeException + */ + public void addPinNumber(Signal s) throws NodeException { + int p = s.getPinNumber(); + if (p >= 0) pins.put(s.getName(), p); + } + + /** + * @return the assigned pins + */ + public TreeMap getPins() { + return pins; + } + /** * A single result column */ diff --git a/src/main/java/de/neemann/digital/builder/PinMap.java b/src/main/java/de/neemann/digital/builder/PinMap.java index 9d3976387..b28688328 100644 --- a/src/main/java/de/neemann/digital/builder/PinMap.java +++ b/src/main/java/de/neemann/digital/builder/PinMap.java @@ -2,8 +2,6 @@ package de.neemann.digital.builder; import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.Variable; -import de.neemann.digital.core.Model; -import de.neemann.digital.core.Signal; import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.lang.Lang; @@ -29,41 +27,6 @@ public class PinMap { availPins = new ArrayList<>(); } - /** - * Reads the pin assignments from the given model - * - * @param model the model - * @return this for chained calls - * @throws PinMapException PinMapException - */ - public PinMap addModel(Model model) throws PinMapException { - for (Signal p : model.getInputs()) - addSignal(p); - for (Signal p : model.getOutputs()) - addSignal(p); - - return this; - } - - private void addSignal(Signal signal) throws PinMapException { - if (signal.getDescription() != null && signal.getDescription().length() > 0) { - StringTokenizer st = new StringTokenizer(signal.getDescription(), "\n\r"); - while (st.hasMoreTokens()) { - String line = st.nextToken(); - if (line.toLowerCase().startsWith("pin ")) { - String intStr = line.substring(4).trim(); - try { - int pin = Integer.parseInt(intStr); - assignPin(signal.getName(), pin); - return; - } catch (NumberFormatException e) { - throw new PinMapException("invalid assignment " + signal.getName() + "=" + intStr); - } - } - } - } - } - /** * Sets the available input pin numbers * @@ -190,9 +153,9 @@ public class PinMap { * @return this for chained calls * @throws PinMapException PinMapException */ - public PinMap addAll(PinMap pinMap) throws PinMapException { + public PinMap addAll(Map pinMap) throws PinMapException { if (pinMap != null) - for (Map.Entry e : pinMap.pinMap.entrySet()) + for (Map.Entry e : pinMap.entrySet()) assignPin(e.getKey(), e.getValue()); return this; } diff --git a/src/main/java/de/neemann/digital/core/Signal.java b/src/main/java/de/neemann/digital/core/Signal.java index cc218667e..57037f8d7 100644 --- a/src/main/java/de/neemann/digital/core/Signal.java +++ b/src/main/java/de/neemann/digital/core/Signal.java @@ -1,5 +1,7 @@ package de.neemann.digital.core; +import java.util.StringTokenizer; + /** * A simple storage bean for signals */ @@ -86,4 +88,29 @@ public final class Signal implements Comparable { public boolean isValid() { return name != null && name.length() > 0 && value != null; } + + /** + * Gets the number of this pin. + * + * @return the pin number of -1 if no pin is given + * @throws NodeException invalid pin number + */ + public int getPinNumber() throws NodeException { + if (getDescription() != null && getDescription().length() > 0) { + StringTokenizer st = new StringTokenizer(getDescription(), "\n\r"); + while (st.hasMoreTokens()) { + String line = st.nextToken(); + if (line.toLowerCase().startsWith("pin ")) { + String intStr = line.substring(4).trim(); + try { + return Integer.parseInt(intStr); + } catch (NumberFormatException e) { + throw new NodeException("invalid pin assignment " + getName() + "=" + intStr); + } + } + } + } + return -1; + } + } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 42a624354..4c979b8f2 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -4,8 +4,6 @@ import de.neemann.digital.analyse.AnalyseException; import de.neemann.digital.analyse.ModelAnalyser; import de.neemann.digital.analyse.TruthTable; import de.neemann.digital.analyse.expression.format.FormatToExpression; -import de.neemann.digital.builder.PinMap; -import de.neemann.digital.builder.PinMapException; import de.neemann.digital.core.*; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.Key; @@ -631,10 +629,9 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E try { Model model = new ModelCreator(circuitComponent.getCircuit(), library).createModel(false); new TableDialog(Main.this, new ModelAnalyser(model).analyse(), shapeFactory, filename) - .setPinMap(new PinMap().addModel(model)) .setVisible(true); stoppedState.enter(); - } catch (PinException | PinMapException | NodeException | AnalyseException | ElementNotFoundException e1) { + } catch (PinException | NodeException | AnalyseException | ElementNotFoundException e1) { showErrorAndStopModel(Lang.get("msg_annalyseErr"), e1); } } diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 29bc15113..8b1599d9f 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -70,7 +70,6 @@ public class TableDialog extends JDialog { private TableColumn column; private int columnIndex; private AllSolutionsDialog allSolutionsDialog; - private PinMap pinMap; private ExpressionListenerStore lastGeneratedExpressions; /** @@ -482,7 +481,7 @@ public class TableDialog extends JDialog { fileChooser.setSelectedFile(filename); if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { try { - expressionExporter.getPinMapping().addAll(pinMap); + expressionExporter.getPinMapping().addAll(model.getTable().getPins()); new BuilderExpressionCreator(expressionExporter.getBuilder(), ExpressionModifier.IDENTITY).create(lastGeneratedExpressions); expressionExporter.export(Main.checkSuffix(fileChooser.getSelectedFile(), suffix)); } catch (ExpressionException | FormatterException | IOException | FuseMapFillerException | PinMapException e) { @@ -536,7 +535,7 @@ public class TableDialog extends JDialog { File f = new File(cuplPath, "CUPL.PLD"); cupl.setProjectName(filename.getName()); - cupl.getPinMapping().addAll(pinMap); + cupl.getPinMapping().addAll(model.getTable().getPins()); new BuilderExpressionCreator(cupl.getBuilder(), ExpressionModifier.IDENTITY).create(lastGeneratedExpressions); try (FileOutputStream out = new FileOutputStream(f)) { cupl.writeTo(out); @@ -570,17 +569,6 @@ public class TableDialog extends JDialog { calculateExpressions(); } - /** - * Sets a pin map - * - * @param pinMap the pin description - * @return this for chained calls - */ - public TableDialog setPinMap(PinMap pinMap) { - this.pinMap = pinMap; - return this; - } - private class CalculationTableModelListener implements TableModelListener { @Override public void tableChanged(TableModelEvent tableModelEvent) { diff --git a/src/test/java/de/neemann/digital/builder/PinMapTest.java b/src/test/java/de/neemann/digital/builder/PinMapTest.java index f4c51fb89..2e43d34e2 100644 --- a/src/test/java/de/neemann/digital/builder/PinMapTest.java +++ b/src/test/java/de/neemann/digital/builder/PinMapTest.java @@ -165,7 +165,7 @@ public class PinMapTest extends TestCase { public void testToString() throws PinMapException { pinMap.assignPin("A", 1); pinMap.assignPin("B", 4); - String pinStr=pinMap.toString(); + String pinStr = pinMap.toString(); assertTrue(pinStr.contains("Pin 1: A\n")); assertTrue(pinStr.contains("Pin 4: B\n")); @@ -181,25 +181,4 @@ public class PinMapTest extends TestCase { "Pin 6: nicht verwendet\n", );*/ } - public void testModelInputs() throws PinMapException { - Model m = new Model(); - m.addInput(new Signal("A_1", new ObservableValue("A_1", 1)).setDescription("Pin 3")); - m.addInput(new Signal("A_2", new ObservableValue("A_2", 1)).setDescription("Pin 1")); - pinMap.addModel(m); - - assertEquals(3, pinMap.getInputFor("A_1")); - assertEquals(1, pinMap.getInputFor("A_2")); - assertEquals(2, pinMap.getInputFor("A_3")); - } - - public void testModelOutputs() throws PinMapException { - Model m = new Model(); - m.addOutput(new Signal("A_1", new ObservableValue("A_1", 1)).setDescription("Pin 6\nTest documentation")); - m.addOutput(new Signal("A_2", new ObservableValue("A_2", 1)).setDescription("Test documentation\nPin 4")); - pinMap.addModel(m); - - assertEquals(6, pinMap.getOutputFor("A_1")); - assertEquals(4, pinMap.getOutputFor("A_2")); - assertEquals(5, pinMap.getOutputFor("A_3")); - } } \ No newline at end of file