simplified table modification

This commit is contained in:
hneemann 2019-09-25 09:02:01 +02:00
parent 83126adb1b
commit 94d42a6088
6 changed files with 43 additions and 47 deletions

View File

@ -18,6 +18,7 @@ import de.neemann.digital.analyse.quinemc.ThreeStateValue;
import de.neemann.digital.lang.Lang; import de.neemann.digital.lang.Lang;
import java.io.*; import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@ -52,7 +53,7 @@ public class TruthTable {
*/ */
public void save(File filename) throws IOException { public void save(File filename) throws IOException {
XStream xStream = getxStream(); XStream xStream = getxStream();
try (Writer out = new OutputStreamWriter(new FileOutputStream(filename), "utf-8")) { try (Writer out = new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8)) {
out.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); out.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
xStream.marshal(this, new PrettyPrintWriter(out)); xStream.marshal(this, new PrettyPrintWriter(out));
} }
@ -68,7 +69,7 @@ public class TruthTable {
if (results.size() > 63) if (results.size() > 63)
throw new IOException(Lang.get("err_tableHasToManyResultColumns")); throw new IOException(Lang.get("err_tableHasToManyResultColumns"));
try (Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "utf-8"))) { try (Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
saveHex(out); saveHex(out);
} }
} }
@ -456,30 +457,18 @@ public class TruthTable {
} }
/** /**
* Sets the don't cares to a given value * Modifies all column in the table
* *
* @param b the value to set * @param m the modifier to use
* @return this for chained calls
*/ */
public void setXto(boolean b) { public TruthTable modifyValues(BoolTableByteArray.TableModifier m) {
for (Result r : results) { for (Result r : results) {
BoolTable bt = r.getValues(); BoolTable bt = r.getValues();
if (bt instanceof BoolTableByteArray) if (bt instanceof BoolTableByteArray)
((BoolTableByteArray) bt).setXTo(b ? 1 : 0); ((BoolTableByteArray) bt).modify(m);
}
}
/**
* Set all table entries to the given value.
* Zero and one behave as expected. All other values represent "don't care"
*
* @param value the value to set
*/
public void setAllTo(int value) {
for (Result r : results) {
BoolTable bt = r.getValues();
if (bt instanceof BoolTableByteArray)
((BoolTableByteArray) bt).setAllTo(value);
} }
return this;
} }
/** /**

View File

@ -79,23 +79,25 @@ public class BoolTableByteArray implements BoolTable {
} }
/** /**
* Sets the don't cares to the given value * Modifies all the table elements using the given modifier.
* *
* @param value the value * @param m the modifier
*/ */
public void setXTo(int value) { public void modify(TableModifier m) {
for (int i = 0; i < table.length; i++) for (int i = 0; i < table.length; i++)
if (table[i] > 1) table[i] = m.modify(table[i]);
table[i] = (byte) value;
} }
/** /**
* Sets all entries to the given value * Modifier to modify the table
*
* @param value the value
*/ */
public void setAllTo(int value) { public interface TableModifier {
for (int i = 0; i < table.length; i++) /**
table[i] = (byte) value; * Creates the modified value
*
* @param b the original value
* @return the modified value
*/
byte modify(byte b);
} }
} }

View File

@ -83,7 +83,7 @@ public class TransitionTableCreator {
// create state variables // create state variables
ArrayList<Variable> vars = new ArrayList<>(); ArrayList<Variable> vars = new ArrayList<>();
for (int i = stateBits - 1; i >= 0; i--) { for (int i = stateBits - 1; i >= 0; i--) {
final Variable var = new Variable(STATE_VAR+"_" + i + "^n"); final Variable var = new Variable(STATE_VAR + "_" + i + "^n");
vars.add(var); vars.add(var);
boolean initVal = (initState & (1 << i)) != 0; boolean initVal = (initState & (1 << i)) != 0;
modelAnalyserInfo.setSequentialInitValue(var.getIdentifier(), initVal ? 1 : 0); modelAnalyserInfo.setSequentialInitValue(var.getIdentifier(), initVal ? 1 : 0);
@ -93,7 +93,7 @@ public class TransitionTableCreator {
// create the next state result variables // create the next state result variables
for (int i = stateBits - 1; i >= 0; i--) for (int i = stateBits - 1; i >= 0; i--)
truthTable.addResult(STATE_VAR+"_" + i + "^{n+1}"); truthTable.addResult(STATE_VAR + "_" + i + "^{n+1}");
// add the output variables // add the output variables
TreeSet<String> results = new TreeSet<>(); TreeSet<String> results = new TreeSet<>();
@ -108,7 +108,7 @@ public class TransitionTableCreator {
} }
// set all to dc // set all to dc
truthTable.setAllTo(2); truthTable.modifyValues(v -> (byte) 2);
// set state output variables // set state output variables
for (State s : states) { for (State s : states) {

View File

@ -366,44 +366,44 @@ public class TableDialog extends JDialog {
setMenu.add(new ToolTipAction(Lang.get("menu_table_setXTo0")) { setMenu.add(new ToolTipAction(Lang.get("menu_table_setXTo0")) {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
TruthTable t = model.getTable(); modifyTable(v -> v > 1 ? 0 : v);
t.setXto(false);
setModel(new TruthTableTableModel(t));
} }
}.setToolTip(Lang.get("menu_table_setXTo0_tt")).createJMenuItem()); }.setToolTip(Lang.get("menu_table_setXTo0_tt")).createJMenuItem());
setMenu.add(new ToolTipAction(Lang.get("menu_table_setXTo1")) { setMenu.add(new ToolTipAction(Lang.get("menu_table_setXTo1")) {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
TruthTable t = model.getTable(); modifyTable(v -> v > 1 ? 1 : v);
t.setXto(true);
setModel(new TruthTableTableModel(t));
} }
}.setToolTip(Lang.get("menu_table_setXTo1_tt")).createJMenuItem()); }.setToolTip(Lang.get("menu_table_setXTo1_tt")).createJMenuItem());
setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllToX")) { setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllToX")) {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
setAllValuesTo(2); modifyTable(v -> (byte) 2);
} }
}.setToolTip(Lang.get("menu_table_setAllToX_tt")).createJMenuItem()); }.setToolTip(Lang.get("menu_table_setAllToX_tt")).createJMenuItem());
setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllTo0")) { setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllTo0")) {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
setAllValuesTo(0); modifyTable(v -> (byte) 0);
} }
}.setToolTip(Lang.get("menu_table_setAllTo0_tt")).createJMenuItem()); }.setToolTip(Lang.get("menu_table_setAllTo0_tt")).createJMenuItem());
setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllTo1")) { setMenu.add(new ToolTipAction(Lang.get("menu_table_setAllTo1")) {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
setAllValuesTo(1); modifyTable(v -> (byte) 1);
} }
}.setToolTip(Lang.get("menu_table_setAllTo1_tt")).createJMenuItem()); }.setToolTip(Lang.get("menu_table_setAllTo1_tt")).createJMenuItem());
setMenu.add(new ToolTipAction(Lang.get("menu_table_invert")) {
@Override
public void actionPerformed(ActionEvent e) {
modifyTable(v -> v > 1 ? v : (byte) (1 - v));
}
}.setToolTip(Lang.get("menu_table_invert_tt")).createJMenuItem());
return setMenu; return setMenu;
} }
private void setAllValuesTo(int value) { private void modifyTable(BoolTableByteArray.TableModifier m) {
TruthTable t = model.getTable(); setModel(new TruthTableTableModel(model.getTable().modifyValues(m)));
t.setAllTo(value);
setModel(new TruthTableTableModel(t));
} }
private JMenu createCreateMenu() { private JMenu createCreateMenu() {

View File

@ -1565,6 +1565,9 @@ Sind evtl. die Namen der Variablen nicht eindeutig?</string>
<string name="menu_table_setAllTo0_tt">Setzt alle Werte auf Null.</string> <string name="menu_table_setAllTo0_tt">Setzt alle Werte auf Null.</string>
<string name="menu_table_setAllTo1">Alles auf 1 setzen</string> <string name="menu_table_setAllTo1">Alles auf 1 setzen</string>
<string name="menu_table_setAllTo1_tt">Setzt alle Werte auf Eins.</string> <string name="menu_table_setAllTo1_tt">Setzt alle Werte auf Eins.</string>
<string name="menu_table_invert">Alle Bits invertieren</string>
<string name="menu_table_invert_tt">Aus einer "1" wird eine "0" und umgekehrt. Don't Cares bleiben unverändert.
</string>
<string name="menu_table_showAllSolutions">Lösungsdialog anzeigen</string> <string name="menu_table_showAllSolutions">Lösungsdialog anzeigen</string>
<string name="menu_table_showAllSolutions_tt">Zeigt den Lösungsdialog wieder an, wenn er manuell geschlossen wurde.</string> <string name="menu_table_showAllSolutions_tt">Zeigt den Lösungsdialog wieder an, wenn er manuell geschlossen wurde.</string>
<string name="menu_terminalDelete">Löschen</string> <string name="menu_terminalDelete">Löschen</string>

View File

@ -1548,6 +1548,8 @@
<string name="menu_table_setAllTo0_tt">Set all values to zero.</string> <string name="menu_table_setAllTo0_tt">Set all values to zero.</string>
<string name="menu_table_setAllTo1">Set all to 1</string> <string name="menu_table_setAllTo1">Set all to 1</string>
<string name="menu_table_setAllTo1_tt">Set all values to one.</string> <string name="menu_table_setAllTo1_tt">Set all values to one.</string>
<string name="menu_table_invert">Invert all bits</string>
<string name="menu_table_invert_tt">A "1" becomes a "0" and vice versa. Don't cares remain unchanged.</string>
<string name="menu_table_showAllSolutions">Show results dialog</string> <string name="menu_table_showAllSolutions">Show results dialog</string>
<string name="menu_table_showAllSolutions_tt">Shows the results dialog again if it was closed manually.</string> <string name="menu_table_showAllSolutions_tt">Shows the results dialog again if it was closed manually.</string>
<string name="menu_terminalDelete">Delete</string> <string name="menu_terminalDelete">Delete</string>