Search in sources :

Example 51 with Value

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();
}
Also used : HashMap(java.util.HashMap) Value(com.cburch.logisim.data.Value) HashSet(java.util.HashSet)

Example 52 with Value

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;
    }
}
Also used : InstanceState(com.cburch.logisim.instance.InstanceState) TestException(com.cburch.logisim.data.TestException) Value(com.cburch.logisim.data.Value) FailException(com.cburch.logisim.data.FailException)

Example 53 with Value

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);
}
Also used : AttributeSet(com.cburch.logisim.data.AttributeSet) Value(com.cburch.logisim.data.Value)

Example 54 with Value

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);
}
Also used : BitWidth(com.cburch.logisim.data.BitWidth) AttributeSet(com.cburch.logisim.data.AttributeSet) Value(com.cburch.logisim.data.Value)

Example 55 with Value

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);
}
Also used : Value(com.cburch.logisim.data.Value)

Aggregations

Value (com.cburch.logisim.data.Value)89 BitWidth (com.cburch.logisim.data.BitWidth)30 Graphics (java.awt.Graphics)15 Location (com.cburch.logisim.data.Location)9 Color (java.awt.Color)8 Bounds (com.cburch.logisim.data.Bounds)7 InstanceDataSingleton (com.cburch.logisim.instance.InstanceDataSingleton)7 AttributeSet (com.cburch.logisim.data.AttributeSet)6 InstanceState (com.cburch.logisim.instance.InstanceState)6 Direction (com.cburch.logisim.data.Direction)3 Instance (com.cburch.logisim.instance.Instance)3 Port (com.cburch.logisim.instance.Port)3 CircuitState (com.cburch.logisim.circuit.CircuitState)2 Component (com.cburch.logisim.comp.Component)2 FailException (com.cburch.logisim.data.FailException)2 TestException (com.cburch.logisim.data.TestException)2 Dimension (java.awt.Dimension)2 FontMetrics (java.awt.FontMetrics)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2