throw new IllegalArgumentException(
String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d",
definition.getMemoryAddressBits(), address.width()));
+ this.memory = memory;
this.data = data;
this.rWBit = rWBit;
this.address = address;
+ memory.registerObserver(a -> update());
data.registerObserver(this);
rWBit.registerObserver(this);
address.registerObserver(this);
-
- this.memory = memory;
}
@Override
protected TimelineEventHandler compute()
{
- if (!address.hasNumericValue())
+ if (!address.getValues().isBinary())
{
if (read.equals(rWBit.getValue()))
return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U.
return e -> data.clearSignals();
}
- long addressed = address.getUnsignedValue();
+ long addressed = address.getValues().getUnsignedValueLong();
if (read.equals(rWBit.getValue()))
{
BitVector storedData = memory.getCell(addressed);
return e -> data.feedSignals(storedData);
- } else
- {
- BitVector transData = data.getValues();
- return e ->
- {
- data.clearSignals();
- memory.setCell(addressed, transData);
- };
}
+ BitVector transData = data.getValues();
+ if (transData.equals(memory.getCell(addressed)))
+ return null;
+ return e ->
+ {
+ data.clearSignals();
+ memory.setCell(addressed, transData);
+ };
}
@Override