X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model.am2900%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fam2900%2Fcomponents%2FModeldff4_finewe.java;h=6aebcbd6db1426d3019c13a6eccecc47a0ae000a;hb=f19559f6899a17526e24a13127743449afb06fa2;hp=a3e7047e047cc7d5a7dae94b1116aa4501536e8c;hpb=7d05144c25daa53e60fc9ed9fd503546a86567f8;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java index a3e7047e..6aebcbd6 100644 --- a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java @@ -46,9 +46,7 @@ public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent @Override public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - QC = new Bit[] { U, U, U, U, U }; + Bit[] QC = castAndInitState(lastState); Bit CVal = readEnds.get("C").getValue(); @@ -77,29 +75,60 @@ public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent @Override protected Object getHighLevelState(Object state, String stateID) { - switch (stateID) + Bit[] QC = castAndInitState(state); + + if ("q".equals(stateID)) + return BitVector.of(Arrays.copyOfRange(QC, 1, 5)); + if (stateID.length() == 2 && stateID.charAt(0) == 'q') { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 1, 5)); - default: - return super.getHighLevelState(state, stateID); + char secondChar = stateID.charAt(1); + if (secondChar >= '1' && secondChar <= '4') + return BitVector.of(QC[secondChar - '0']); } + return super.getHighLevelState(state, stateID); } @Override protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) { - switch (stateID) + Bit[] QC = castAndInitState(lastState); + + if ("q".equals(stateID)) { - case "q": BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; if (newHighLevelStateCasted.length() != 4) throw new IllegalArgumentException("Expected BitVector of length 4, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 1, 4); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, QC, 1, 4); + return QC; + } + if (stateID.length() == 2 && stateID.charAt(0) == 'q') + { + char secondChar = stateID.charAt(1); + if (secondChar >= '1' && secondChar <= '4') + { + Bit newHighLevelStateCasted; + if (newHighLevelState instanceof Bit) + newHighLevelStateCasted = (Bit) newHighLevelState; + else + { + BitVector vector = (BitVector) newHighLevelState; + if (vector.length() != 1) + throw new IllegalArgumentException("Expected BitVector of length 1, not " + vector.length()); + newHighLevelStateCasted = vector.getMSBit(0); + } + QC[secondChar - '0'] = newHighLevelStateCasted; + return QC; + } } + return super.setHighLevelState(QC, stateID, newHighLevelState); + } + + private static Bit[] castAndInitState(Object state) + { + Bit[] QC = (Bit[]) state; + if (QC == null) + QC = new Bit[] { U, U, U, U, U }; + return QC; } static