projects
/
Mograsim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixed nand and nor gate to work with more than two inputs
[Mograsim.git]
/
net.mograsim.logic.core
/
src
/
net
/
mograsim
/
logic
/
core
/
wires
/
Wire.java
diff --git
a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
index
d73ee61
..
bae4cb4
100644
(file)
--- a/
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
+++ b/
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
@@
-6,6
+6,8
@@
import static net.mograsim.logic.core.types.Bit.Z;
import java.util.ArrayList;
import java.util.List;
import java.util.ArrayList;
import java.util.List;
+import net.mograsim.logic.core.LogicObservable;
+import net.mograsim.logic.core.LogicObserver;
import net.mograsim.logic.core.timeline.Timeline;
import net.mograsim.logic.core.types.Bit;
import net.mograsim.logic.core.types.BitVector;
import net.mograsim.logic.core.timeline.Timeline;
import net.mograsim.logic.core.types.Bit;
import net.mograsim.logic.core.types.BitVector;
@@
-19,18
+21,25
@@
import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
*/
public class Wire
{
*/
public class Wire
{
+ public final String name;
private BitVector values;
public final int travelTime;
private BitVector values;
public final int travelTime;
- private List<ReadEnd> attached = new ArrayList<
ReadEnd
>();
+ private List<ReadEnd> attached = new ArrayList<>();
public final int length;
public final int length;
-
private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd
>();
-
private
Timeline timeline;
+
List<ReadWriteEnd> inputs = new ArrayList<
>();
+ Timeline timeline;
public Wire(Timeline timeline, int length, int travelTime)
public Wire(Timeline timeline, int length, int travelTime)
+ {
+ this(timeline, length, travelTime, null);
+ }
+
+ public Wire(Timeline timeline, int length, int travelTime, String name)
{
if (length < 1)
throw new IllegalArgumentException(
String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
{
if (length < 1)
throw new IllegalArgumentException(
String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
+ this.name = name;
this.timeline = timeline;
this.length = length;
this.travelTime = travelTime;
this.timeline = timeline;
this.length = length;
this.travelTime = travelTime;
@@
-59,12
+68,12
@@
public class Wire
{
if (values.equals(newValues))
return;
{
if (values.equals(newValues))
return;
-
BitVector oldValues = values;
+
//
BitVector oldValues = values;
values = newValues;
values = newValues;
- notifyObservers(
oldValues
);
+ notifyObservers();
}
}
-
private
void recalculate()
+ void recalculate()
{
switch (inputs.size())
{
{
switch (inputs.size())
{
@@
-165,27
+174,26
@@
public class Wire
}
/**
}
/**
- * Adds an {@link
Wire
Observer}, who will be notified when the value of the {@link Wire} is updated.
+ * Adds an {@link
Logic
Observer}, who will be notified when the value of the {@link Wire} is updated.
*
*
- * @param ob The {@link
Wire
Observer} to be notified of changes.
- * @return true if the given {@link
Wire
Observer} was not already registered, false otherwise
+ * @param ob The {@link
Logic
Observer} to be notified of changes.
+ * @return true if the given {@link
Logic
Observer} was not already registered, false otherwise
*
* @author Fabian Stemmler
*/
*
* @author Fabian Stemmler
*/
-
private
void attachEnd(ReadEnd end)
+ void attachEnd(ReadEnd end)
{
attached.add(end);
}
{
attached.add(end);
}
-
private
void detachEnd(ReadEnd end)
+ void detachEnd(ReadEnd end)
{
attached.remove(end);
}
{
attached.remove(end);
}
- private void notifyObservers(
BitVector oldValues
)
+ private void notifyObservers()
{
{
- for (ReadEnd o : attached)
- o.update(oldValues);
+ attached.forEach(r -> r.update());
}
/**
}
/**
@@
-204,7
+212,7
@@
public class Wire
return new ReadEnd();
}
return new ReadEnd();
}
-
private
void registerInput(ReadWriteEnd toRegister)
+ void registerInput(ReadWriteEnd toRegister)
{
inputs.add(toRegister);
}
{
inputs.add(toRegister);
}
@@
-216,20
+224,19
@@
public class Wire
*
* @author Fabian Stemmler
*/
*
* @author Fabian Stemmler
*/
- public class ReadEnd
+ public class ReadEnd
implements LogicObservable
{
{
- private List<
WireObserver> observers = new ArrayList<WireObserver
>();
+ private List<
LogicObserver> observers = new ArrayList<
>();
-
private
ReadEnd()
+ ReadEnd()
{
super();
Wire.this.attachEnd(this);
}
{
super();
Wire.this.attachEnd(this);
}
- public void update(
BitVector oldValues
)
+ public void update()
{
{
- for (WireObserver ob : observers)
- ob.update(this, oldValues);
+ notifyObservers();
}
/**
}
/**
@@
-333,14
+340,27
@@
public class Wire
return length;
}
return length;
}
- public
boolean addObserver(WireObserver ob
)
+ public
Wire getWire(
)
{
{
- return
observers.add(ob)
;
+ return
Wire.this
;
}
}
- public Wire getWire()
+ @Override
+ public void registerObserver(LogicObserver ob)
{
{
- return Wire.this;
+ observers.add(ob);
+ }
+
+ @Override
+ public void deregisterObserver(LogicObserver ob)
+ {
+ observers.remove(ob);
+ }
+
+ @Override
+ public void notifyObservers()
+ {
+ observers.forEach(ob -> ob.update(this));
}
}
}
}
@@
-349,7
+369,7
@@
public class Wire
private boolean open;
private BitVector inputValues;
private boolean open;
private BitVector inputValues;
-
private
ReadWriteEnd()
+ ReadWriteEnd()
{
super();
open = true;
{
super();
open = true;
@@
-478,8
+498,8
@@
public class Wire
@Override
public String toString()
{
@Override
public String toString()
{
-
return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs)
;
- // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)
+
String name = this.name == null ? String.format("0x%08x", hashCode()) : this.name
;
+ return String.format("wire %s value: %s inputs: %s", name, values, inputs);
}
public static ReadEnd[] extractEnds(Wire[] w)
}
public static ReadEnd[] extractEnds(Wire[] w)