use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Propagator method stepInternal.
private void stepInternal(PropagationPoints changedPoints) {
if (toProcess.isEmpty())
return;
// update clock
clock = toProcess.peek().time;
// propagate all values for this clock tick
HashMap<CircuitState, HashSet<ComponentPoint>> visited = new HashMap<CircuitState, HashSet<ComponentPoint>>();
while (true) {
SetData data = toProcess.peek();
if (data == null || data.time != clock)
break;
toProcess.remove();
CircuitState state = data.state;
// if it's already handled for this clock tick, continue
HashSet<ComponentPoint> handled = visited.get(state);
if (handled != null) {
if (!handled.add(new ComponentPoint(data.cause, data.loc)))
continue;
} else {
handled = new HashSet<ComponentPoint>();
visited.put(state, handled);
handled.add(new ComponentPoint(data.cause, data.loc));
}
if (changedPoints != null)
changedPoints.add(state, data.loc);
// change the information about value
SetData oldHead = state.causes.get(data.loc);
Value oldVal = computeValue(oldHead);
SetData newHead = addCause(state, oldHead, data);
Value newVal = computeValue(newHead);
// if the value at point has changed, propagate it
if (!newVal.equals(oldVal)) {
state.markPointAsDirty(data.loc);
}
}
clearDirtyPoints();
clearDirtyComponents();
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Circuit method doTestVector.
/**
* Code taken from Cornell's version of Logisim:
* http://www.cs.cornell.edu/courses/cs3410/2015sp/
*/
public void doTestVector(Project project, Instance[] pin, Value[] val) throws TestException {
CircuitState state = project.getCircuitState();
state.reset();
for (int i = 0; i < pin.length; ++i) {
if (Pin.FACTORY.isInputPin(pin[i])) {
InstanceState pinState = state.getInstanceState(pin[i]);
Pin.FACTORY.setValue(pinState, val[i]);
}
}
Propagator prop = state.getPropagator();
try {
prop.propagate();
} catch (Throwable thr) {
thr.printStackTrace();
}
if (prop.isOscillating())
throw new TestException("oscilation detected");
FailException err = null;
for (int i = 0; i < pin.length; i++) {
InstanceState pinState = state.getInstanceState(pin[i]);
if (Pin.FACTORY.isInputPin(pin[i]))
continue;
Value v = Pin.FACTORY.getValue(pinState);
if (!val[i].compatible(v)) {
if (err == null)
err = new FailException(i, pinState.getAttributeValue(StdAttr.LABEL), val[i], v);
else
err.add(new FailException(i, pinState.getAttributeValue(StdAttr.LABEL), val[i], v));
}
}
if (err != null) {
throw err;
}
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class AbstractGate method propagate.
@Override
public void propagate(InstanceState state) {
GateAttributes attrs = (GateAttributes) state.getAttributeSet();
int inputCount = attrs.inputs;
int negated = attrs.negated;
AttributeSet opts = state.getProject().getOptions().getAttributeSet();
boolean errorIfUndefined = opts.getValue(Options.ATTR_GATE_UNDEFINED).equals(Options.GATE_UNDEFINED_ERROR);
Value[] inputs = new Value[inputCount];
int numInputs = 0;
boolean error = false;
for (int i = 1; i <= inputCount; i++) {
if (state.isPortConnected(i)) {
int negatedBit = (negated >> (i - 1)) & 1;
if (negatedBit == 1) {
inputs[numInputs] = state.getPortValue(i).not();
} else {
inputs[numInputs] = state.getPortValue(i);
}
numInputs++;
} else {
if (errorIfUndefined) {
error = true;
}
}
}
Value out = null;
if (numInputs == 0 || error) {
out = Value.createError(attrs.width);
} else {
out = computeOutput(inputs, numInputs, state);
out = pullOutput(out, attrs.out);
}
state.setPort(0, out, GateAttributes.DELAY);
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Buffer method repair.
//
// static methods - shared with other classes
//
static Value repair(InstanceState state, Value v) {
AttributeSet opts = state.getProject().getOptions().getAttributeSet();
Object onUndefined = opts.getValue(Options.ATTR_GATE_UNDEFINED);
boolean errorIfUndefined = onUndefined.equals(Options.GATE_UNDEFINED_ERROR);
Value repaired;
if (errorIfUndefined) {
int vw = v.getWidth();
BitWidth w = state.getAttributeValue(StdAttr.WIDTH);
int ww = w.getWidth();
if (vw == ww && v.isFullyDefined())
return v;
Value[] vs = new Value[w.getWidth()];
for (int i = 0; i < vs.length; i++) {
Value ini = i < vw ? v.get(i) : Value.ERROR;
vs[i] = ini.isFullyDefined() ? ini : Value.ERROR;
}
repaired = Value.create(vs);
} else {
repaired = v;
}
Object outType = state.getAttributeValue(GateAttributes.ATTR_OUTPUT);
return AbstractGate.pullOutput(repaired, outType);
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Buffer method propagate.
@Override
public void propagate(InstanceState state) {
Value in = state.getPortValue(1);
in = Buffer.repair(state, in);
state.setPort(0, in, GateAttributes.DELAY);
}
Aggregations