X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Fwires%2FCoreWire.java;h=13f54a0188bbb4d62f763e8f6181c4b4569aceba;hb=9c98bb5456a7ead6d92fcc6acd9d1497688b244d;hp=f643f8ecc67e53cc6dba6d493512cc717fb01715;hpb=0a04a4ed66ecebd4254541c4977599f6052c115a;p=Mograsim.git diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java index f643f8ec..13f54a01 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java @@ -5,7 +5,9 @@ import static net.mograsim.logic.core.types.Bit.Z; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import net.mograsim.logic.core.LogicObservable; import net.mograsim.logic.core.LogicObserver; @@ -122,68 +124,9 @@ public class CoreWire */ public void forceValues(BitVector values) { - setNewValues(values); - } - - /** - * The {@link CoreWire} is interpreted as an unsigned integer with n bits. - * - * @return true if all bits are either Bit.ONE or Bit.ZERO (they do not all have to have the same - * value), not Bit.U, Bit.X or Bit.Z. false is returned otherwise. - * - * @author Fabian Stemmler - */ - public boolean hasNumericValue() - { - return getValues().isBinary(); - } - - /** - * The {@link CoreWire} is interpreted as an unsigned integer with n bits. - * - * @return The unsigned value of the {@link CoreWire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on. - * - * @author Fabian Stemmler - */ - public long getUnsignedValue() - { - long val = 0; - long mask = 1; - for (Bit bit : getValues()) - { - switch (bit) - { - default: - case Z: - case X: - return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0; - case ONE: - val |= mask; - break; - case ZERO: - } - mask = mask << 1; - } - return val; - } - - /** - * The {@link CoreWire} is interpreted as a signed integer with n bits. - * - * @return The signed value of the {@link CoreWire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on. - * - * @author Fabian Stemmler - */ - public long getSignedValue() - { - long val = getUnsignedValue(); - long mask = 1 << (width - 1); - if ((mask & val) != 0) - { - int shifts = 64 - width; - return (val << shifts) >> shifts; - } - return val; + bitsWithoutFusions = values.getBits(); + invalidateCachedValuesForAllFusedWires(); + notifyObservers(); } /** @@ -238,7 +181,8 @@ public class CoreWire } /** - * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written to. + * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written + * to. */ public ReadWriteEnd createReadWriteEnd() { @@ -261,8 +205,8 @@ public class CoreWire /** * A {@link ReadEnd} feeds a constant signal into the {@link CoreWire} it is tied to. The combination of all inputs determines the - * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than Z 0 - * and 1 turn into X when they are mixed + * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than + * Z 0 and 1 turn into X when they are mixed * * @author Fabian Stemmler */ @@ -321,43 +265,6 @@ public class CoreWire return CoreWire.this.getValues(start, end); } - /** - * The {@link CoreWire} is interpreted as an unsigned integer with n bits. - * - * @return true if all bits are either Bit.ONE or Bit.ZERO (they do not all have to have the - * same value), not Bit.X or Bit.Z. false is returned otherwise. - * - * @author Fabian Stemmler - */ - public boolean hasNumericValue() - { - return CoreWire.this.hasNumericValue(); - } - - /** - * The {@link CoreWire} is interpreted as an unsigned integer with n bits. - * - * @return The unsigned value of the {@link CoreWire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on. - * - * @author Fabian Stemmler - */ - public long getUnsignedValue() - { - return CoreWire.this.getUnsignedValue(); - } - - /** - * The {@link CoreWire} is interpreted as a signed integer with n bits. - * - * @return The signed value of the {@link CoreWire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on. - * - * @author Fabian Stemmler - */ - public long getSignedValue() - { - return CoreWire.this.getSignedValue(); - } - @Override public String toString() { @@ -442,6 +349,7 @@ public class CoreWire feedSignals(BitVector.of(newValues)); } + // TODO what if this is called multiple times at the same simulation time? (happens in component unit tests) public void feedSignals(BitVector newValues) { if (newValues.length() != width) @@ -665,11 +573,11 @@ public class CoreWire private static class FusedBit { - private final List participatingWireBits; + private final Set participatingWireBits; public FusedBit() { - this.participatingWireBits = new ArrayList<>(); + this.participatingWireBits = new HashSet<>(); } public void addParticipatingWireBit(CoreWire w, int bit) @@ -719,5 +627,36 @@ public class CoreWire this.wire = wire; this.bit = bit; } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + bit; + result = prime * result + ((wire == null) ? 0 : wire.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WireBit other = (WireBit) obj; + if (bit != other.bit) + return false; + if (wire == null) + { + if (other.wire != null) + return false; + } else if (!wire.equals(other.wire)) + return false; + return true; + } } } \ No newline at end of file