mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 01:14:42 -04:00
migrated Splitter to Bits helper class
This commit is contained in:
parent
e6120e7b27
commit
298d2890a0
@ -32,8 +32,8 @@ public class ObservableValue extends Observable implements PinDescription {
|
|||||||
/**
|
/**
|
||||||
* Creates a new instance.
|
* Creates a new instance.
|
||||||
*
|
*
|
||||||
* @param name the name of this value
|
* @param name the name of this value
|
||||||
* @param bits the number of bits
|
* @param bits the number of bits
|
||||||
*/
|
*/
|
||||||
public ObservableValue(String name, int bits) {
|
public ObservableValue(String name, int bits) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -58,15 +58,14 @@ public class ObservableValue extends Observable implements PinDescription {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the value and fires an event if value has changed.
|
* Sets the value and fires an event if the value has changed.
|
||||||
* Also sets this value to low Z
|
* Also sets all bits to low Z.
|
||||||
*
|
*
|
||||||
* @param value the new value
|
* @param value the new value
|
||||||
* @return this for chained calls
|
* @return this for chained calls
|
||||||
*/
|
*/
|
||||||
public ObservableValue setValue(long value) {
|
public ObservableValue setValue(long value) {
|
||||||
set(value, 0);
|
return set(value, 0);
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -129,7 +129,7 @@ public class Splitter implements Element {
|
|||||||
inValue.addObserverToValue(new NodeWithoutDelay(outValue) {
|
inValue.addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
@Override
|
@Override
|
||||||
public void hasChanged() {
|
public void hasChanged() {
|
||||||
outValue.set(inValue.getValue() >> bitPos, inValue.getHighZ() >> bitPos);
|
outValue.set(inValue.getValue() >>> bitPos, inValue.getHighZ() >>> bitPos);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break; // done!! out is completely filled!
|
break; // done!! out is completely filled!
|
||||||
@ -138,7 +138,7 @@ public class Splitter implements Element {
|
|||||||
// complete in value needs to be copied to a part of the output
|
// complete in value needs to be copied to a part of the output
|
||||||
if (out.getPos() <= in.getPos() && in.getPos() + in.getBits() <= out.getPos() + out.getBits()) {
|
if (out.getPos() <= in.getPos() && in.getPos() + in.getBits() <= out.getPos() + out.getBits()) {
|
||||||
final int bitPos = in.getPos() - out.getPos();
|
final int bitPos = in.getPos() - out.getPos();
|
||||||
final long mask = ~(((1L << in.bits) - 1) << bitPos);
|
final long mask = ~Bits.up(Bits.mask(in.bits), bitPos);
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
@ -159,7 +159,7 @@ public class Splitter implements Element {
|
|||||||
// upper part of input needs to be copied to the lower part of the output
|
// upper part of input needs to be copied to the lower part of the output
|
||||||
if (in.getPos() < out.getPos()) {
|
if (in.getPos() < out.getPos()) {
|
||||||
final int bitsToCopy = in.getPos() + in.getBits() - out.getPos();
|
final int bitsToCopy = in.getPos() + in.getBits() - out.getPos();
|
||||||
final long mask = ~((1L << bitsToCopy) - 1);
|
final long mask = ~Bits.mask(bitsToCopy);
|
||||||
final int shift = out.getPos() - in.getPos();
|
final int shift = out.getPos() - in.getPos();
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
@ -170,7 +170,7 @@ public class Splitter implements Element {
|
|||||||
long out12 = outValue.getValue();
|
long out12 = outValue.getValue();
|
||||||
long inz12 = inValue.getHighZ();
|
long inz12 = inValue.getHighZ();
|
||||||
long outz12 = outValue.getHighZ();
|
long outz12 = outValue.getHighZ();
|
||||||
outValue.set((out12 & mask) | (in12 >> shift), (outz12 & mask) | (inz12 >> shift));
|
outValue.set((out12 & mask) | (in12 >>> shift), (outz12 & mask) | (inz12 >>> shift));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
continue;
|
continue;
|
||||||
@ -179,7 +179,7 @@ public class Splitter implements Element {
|
|||||||
// lower part of input needs to be copied to the upper part of the output
|
// lower part of input needs to be copied to the upper part of the output
|
||||||
final int bitsToCopy = out.getPos() + out.getBits() - in.getPos();
|
final int bitsToCopy = out.getPos() + out.getBits() - in.getPos();
|
||||||
final int shift = in.getPos() - out.getPos();
|
final int shift = in.getPos() - out.getPos();
|
||||||
final long mask = ~(((1L << bitsToCopy) - 1) << shift);
|
final long mask = ~Bits.up(Bits.mask(bitsToCopy), shift);
|
||||||
final ObservableValue inValue = inputs.get(in.number);
|
final ObservableValue inValue = inputs.get(in.number);
|
||||||
final ObservableValue outValue = outputs.get(out.number);
|
final ObservableValue outValue = outputs.get(out.number);
|
||||||
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
inputs.get(in.number).addObserverToValue(new NodeWithoutDelay(outValue) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user