SOURCE

function Agenda() {
    var list = [];

    this.currentTime = function() {
        return 0;
    }

    this.add = function(time, action) {
        list.push()
    }
}

var agenda = new Agenda();

var afterDelay = function(delay, func) {
    agenda.add
}

function makeWire() {
    return {
        value: 0,
        actions: []
    };

}

function getSignal(wire) {
    return wire.value;
}

function setSignal(wire, value) {
    if (wire.value != value) {
        wire.value = value;
        wire.actions.forEach(function(func) {
            func();
        });
    }
}

function addAction(wire, func) {
    wire.actions.push(func);
    func();
}

var halfAdder = function(a, b, s, c) {
    var d = makeWire();
    var e = makeWire();
    orGate(a, b, d);
    andGate(a, b, c);
    inverter(c, e);
    andGate(d, e, s);
}

var fullAdder = function(a, b, cIn, sum, cOut) {
    var s = makeWire();
    var c1 = makeWire();
    var c2 = makeWire();

    halfAdder(b, cIn, s, c1);
    halfAdder(a, s, sum, c2);
    orGate(c1, c2, cOut);
}

var logicalNot = function(s) {
    return !s;
}

var logicalAnd = function(a, b) {
    return a && b;
}

var logicalOr = function(a, b) {
    return a || b;
}



var inverter = function(input, output) {
    addAction(input, function() {
        afterDelay(inverterDelay, function() {
            var newValue = logicalNot(getSignal(input));
            setSignal(output, newValue);
        });
    });
}

var andGate = function(a1, a2, output) {
    var onChange = function() {
        afterDelay(andGateDelay, function() {
            var newValue = logicalAnd(getSignal(a1), getSignal(a2));
            setSignal(output, newValue);
        });
    }
    addAction(a1, onChange);
    addAction(a2, onChange);
}

var orGate = function(a1, a2, output) {
    var w1 = makeWire();
    var w2 = makeWire();
    var w3 = makeWire();
    var onChange = function() {
        afterDelay(orGateDelay, function() {
            inverter(a1, w1);
            inverter(a2, w2);
            andGate(w1, w2, w3);
            inverter(w3, output);
        });
    }

    addAction(a1, onChange);
    addAction(a2, onChange);
}

var rippleCarryAdder = function(aWires, bWires, sumWires, c) {
    for (var i = 0; i < 8; i++) {
        fullAdder(aWires[i], bWires[i], c, sumWires[i], c);
    }
}
console 命令行工具 X clear

                    
>
console