diff --git a/src/main/java/de/neemann/digital/fsm/State.java b/src/main/java/de/neemann/digital/fsm/State.java index 800a84efa..a9cf4441f 100644 --- a/src/main/java/de/neemann/digital/fsm/State.java +++ b/src/main/java/de/neemann/digital/fsm/State.java @@ -28,6 +28,7 @@ public class State extends Movable { private int radius; private boolean isInitial; private int initialAngle = 12; + private boolean defaultDC; /** * Creates a new state @@ -46,6 +47,7 @@ public class State extends Movable { this.number = other.number; this.isInitial = other.isInitial; this.initialAngle = other.initialAngle; + this.defaultDC = other.defaultDC; setValues(other.getValues()); setPos(other.getPos()); } @@ -277,4 +279,12 @@ public class State extends Movable { } }; } + + public boolean isDefaultDC() { + return defaultDC; + } + + public void setDefaultDC(boolean defaultDC) { + this.defaultDC = defaultDC; + } } diff --git a/src/main/java/de/neemann/digital/fsm/TransitionTableCreator.java b/src/main/java/de/neemann/digital/fsm/TransitionTableCreator.java index 042ce97f9..816a5f5dd 100644 --- a/src/main/java/de/neemann/digital/fsm/TransitionTableCreator.java +++ b/src/main/java/de/neemann/digital/fsm/TransitionTableCreator.java @@ -115,8 +115,9 @@ public class TransitionTableCreator { int row = s.getNumber(); int col = stateBits * 2; for (String name : results) { + int def = s.isDefaultDC() ? 2 : 0; Integer val = getValues(s).get(name); - int v = val == null ? 0 : val; + int v = val == null ? def : val; truthTable.setValue(row, col, v); col++; } @@ -129,7 +130,10 @@ public class TransitionTableCreator { int m = row; for (int j = 0; j < stateBits; j++) { c--; - truthTable.setValue(row, c, m & 1); + int aValue = 2; + if (!s.isDefaultDC()) + aValue = m & 1; + truthTable.setValue(row, c, aValue); m >>= 1; } } diff --git a/src/main/java/de/neemann/digital/fsm/gui/FSMComponent.java b/src/main/java/de/neemann/digital/fsm/gui/FSMComponent.java index 1c257182e..1b0eb7b81 100644 --- a/src/main/java/de/neemann/digital/fsm/gui/FSMComponent.java +++ b/src/main/java/de/neemann/digital/fsm/gui/FSMComponent.java @@ -31,6 +31,7 @@ import static de.neemann.digital.gui.components.CircuitComponent.ICON_DELETE; public class FSMComponent extends JComponent { private static final Key KEY_NUMBER = new Key.KeyInteger("stateNum", 0); private static final Key KEY_INITIAL = new Key<>("isInitialState", false); + private static final Key KEY_DEFAULT_DC = new Key<>("defaultsDC", false); private static final Key KEY_VALUES = new Key<>("stateValues", ""); private static final Key KEY_CONDITION = new Key<>("transCond", ""); private static final Key KEY_RADIUS = new Key.KeyInteger("transRad", 70) @@ -179,7 +180,7 @@ public class FSMComponent extends JComponent { setPreferredSize(new Dimension(600, 600)); } - private static final Key[] STATE_EDIT_KEYS = {Keys.LABEL, KEY_NUMBER, KEY_INITIAL, KEY_VALUES, KEY_RADIUS}; + private static final Key[] STATE_EDIT_KEYS = {Keys.LABEL, KEY_NUMBER, KEY_INITIAL, KEY_VALUES, KEY_RADIUS, KEY_DEFAULT_DC}; private void createNewState(Vector posVector, Point point) { ElementAttributes attr = new ElementAttributes(); @@ -207,6 +208,7 @@ public class FSMComponent extends JComponent { ElementAttributes attr = new ElementAttributes() .set(KEY_NUMBER, state.getNumber()) .set(KEY_INITIAL, state.isInitial()) + .set(KEY_DEFAULT_DC, state.isDefaultDC()) .set(KEY_VALUES, state.getValues()) .set(KEY_RADIUS, state.getVisualRadius()) .set(Keys.LABEL, state.getName()); @@ -218,6 +220,7 @@ public class FSMComponent extends JComponent { if (newAttr != null) { state.setNumber(newAttr.get(KEY_NUMBER)); state.setInitial(newAttr.get(KEY_INITIAL)); + state.setDefaultDC(newAttr.get(KEY_DEFAULT_DC)); state.setValues(newAttr.get(KEY_VALUES)); state.setRadius(newAttr.get(KEY_RADIUS)); state.setName(newAttr.get(Keys.LABEL)); diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index c4f15f3ed..11c5dd90c 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -2426,6 +2426,8 @@ Sie dürfen jedoch nicht oberhalb der Kopfzeile mit den Signalnamen verwendet we Wenn gesetzt, ist dies der Initialzustand, in welchem der Automat gestartet wird. + Nicht definierte Werte auf DC setzen + Setzt alle nicht definierten Werte (Folgezustand und Ausgänge) auf "Don't care" Ausgänge Legt Ausgangswerte fest. Mit einfachen Zuweisungen wie "A=1, B=0" können Ausgänge gesetzt werden. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index b1c605997..409776f56 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -2401,6 +2401,8 @@ However, they must not be used above the header line listing the signal names.The number which represents this state. Initial State If set, this state is the initial state. + Set undefined values to DC + Sets all undefined values (following state and outputs) to "Don't Care". Outputs Defines the output values. With simple assignments like "A=1, B=0" outputs can be set.