setSize(40, 40);
addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM);
addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT);
- addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT);
+ addPin(new Pin(model, this, "LD", 1, PinUsage.INPUT, 0, 20), Position.RIGHT);
addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT);
addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT);
addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP);
@Override
public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
{
- Bit[] QC = (Bit[]) lastState;
- if (QC == null)
- {
- QC = new Bit[13];
- Arrays.fill(QC, U);
- }
+ Bit[] QC = castAndInitState(lastState);
ReadEnd D = readEnds.get("D");
ReadEnd _RLD = readEnds.get("_RLD");
- ReadEnd WE = readEnds.get("WE");
+ ReadEnd LD = readEnds.get("LD");
ReadEnd DEC = readEnds.get("DEC");
ReadEnd C = readEnds.get("C");
ReadWriteEnd Y = readWriteEnds.get("Y");
// TODO handle U/X/Z
if (oldCVal == ZERO && CVal == ONE)
{
- if ((DEC.getValue() == ZERO && WE.getValue() == ONE) || _RLD.getValue() == ZERO)
+ if (LD.getValue() == ONE || _RLD.getValue() == ZERO)
System.arraycopy(D.getValues().getBits(), 0, QC, 0, 12);
- else if (WE.getValue() == ONE)
+ else if (DEC.getValue() == ONE)
{
Bit carry = Bit.ZERO;
// TODO extract to helper. This code almost also exists in Modelinc.
@Override
protected Object getHighLevelState(Object state, String stateID)
{
+ Bit[] QC = castAndInitState(state);
+
switch (stateID)
{
case "q":
- return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12));
+ return BitVector.of(Arrays.copyOfRange(QC, 0, 12));
default:
- return super.getHighLevelState(state, stateID);
+ return super.getHighLevelState(QC, stateID);
}
}
@Override
protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState)
{
+ Bit[] QC = castAndInitState(lastState);
+
switch (stateID)
{
case "q":
BitVector newHighLevelStateCasted = (BitVector) newHighLevelState;
if (newHighLevelStateCasted.length() != 12)
throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length());
- System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12);
- return lastState;
+ System.arraycopy(newHighLevelStateCasted.getBits(), 0, QC, 0, 12);
+ return QC;
default:
- return super.setHighLevelState(lastState, stateID, newHighLevelState);
+ return super.setHighLevelState(QC, stateID, newHighLevelState);
+ }
+ }
+
+ private static Bit[] castAndInitState(Object lastState)
+ {
+ Bit[] QC = (Bit[]) lastState;
+ if (QC == null)
+ {
+ QC = new Bit[13];
+ Arrays.fill(QC, U);
}
+ return QC;
}
static