@Override
public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
{
- BitVector[] memC = (BitVector[]) lastState;
- if (memC == null)
- {
- memC = new BitVector[6];
- Arrays.fill(memC, 0, 5, BitVector.of(U, 12));
- memC[5] = BitVector.of(U);
- }
+ BitVector[] memC = castAndInitState(lastState);
+
BitVector CVal = readEnds.get("C").getValues();
BitVector oldC = memC[5];
// TODO is the timing right?
return (bits[0] == ONE ? 4 : 0) + (bits[1] == ONE ? 2 : 0) + (bits[2] == ONE ? 1 : 0);
}
- Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100)");
+ Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100).q");
@Override
protected Object getHighLevelState(Object state, String stateID)
{
+ BitVector[] memC = castAndInitState(state);
+
Matcher m = stateIDPattern.matcher(stateID);
if (m.matches())
- return ((BitVector[]) state)[Integer.parseInt(m.group(1), 2)];
- return super.getHighLevelState(state, stateID);
+ return memC[Integer.parseInt(m.group(1), 2)];
+ return super.getHighLevelState(memC, stateID);
}
@Override
protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState)
{
+ BitVector[] memC = castAndInitState(lastState);
+
Matcher m = stateIDPattern.matcher(stateID);
if (m.matches())
{
BitVector newHighLevelStateCasted = (BitVector) newHighLevelState;
if (newHighLevelStateCasted.length() != 12)
throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length());
- BitVector[] memC = (BitVector[]) lastState;
memC[addr] = newHighLevelStateCasted;
return memC;
}
- return super.setHighLevelState(lastState, stateID, newHighLevelState);
+ return super.setHighLevelState(memC, stateID, newHighLevelState);
+ }
+
+ private static BitVector[] castAndInitState(Object state)
+ {
+ BitVector[] memC = (BitVector[]) state;
+ if (memC == null)
+ {
+ memC = new BitVector[6];
+ Arrays.fill(memC, 0, 5, BitVector.of(U, 12));
+ memC[5] = BitVector.of(U);
+ }
+ return memC;
}
static