1

I am following the course nand2tetris and doing the exercises but not with there software. Instead I'm trying todo everything in javascript. The purpose is to build a nand gate and from that you create all your chips/gates.

I wrote for every gate unit tests and they pass but for my 16 bit adder they fail and I don't really know why.

function Adder() {
    this.halfAdder = function(a, b) {
        var gate = new Gate();
        var sum = gate.XOR(a, b);
        var carry = gate.AND(a, b);
        return [sum, carry];
    };

    this.fullAdder = function(a, b, c) {
        var gate = new Gate();
        var out1 = this.halfAdder(a, b);
        var out2 = this.halfAdder(c, out1[0]);
        var result = gate.OR(out1[1], out2[1])
        return [out2[0], result];
    };

    this.Adder16 = function(a, b) {
        /*
    HalfAdder(a=a[0],b=b[0],sum=out[0],carry=carry1);
    FullAdder(a=a[1],b=b[1],c=carry1,sum=out[1],carry=carry2);
    FullAdder(a=a[2],b=b[2],c=carry2,sum=out[2],carry=carry3);
    FullAdder(a=a[3],b=b[3],c=carry3,sum=out[3],carry=carry4);
    FullAdder(a=a[4],b=b[4],c=carry4,sum=out[4],carry=carry5);
    FullAdder(a=a[5],b=b[5],c=carry5,sum=out[5],carry=carry6);
    FullAdder(a=a[6],b=b[6],c=carry6,sum=out[6],carry=carry7);
    FullAdder(a=a[7],b=b[7],c=carry7,sum=out[7],carry=carry8);
    FullAdder(a=a[8],b=b[8],c=carry8,sum=out[8],carry=carry9);
    FullAdder(a=a[9],b=b[9],c=carry9,sum=out[9],carry=carry10);
    FullAdder(a=a[10],b=b[10],c=carry10,sum=out[10],carry=carry11);
    FullAdder(a=a[11],b=b[11],c=carry11,sum=out[11],carry=carry12);
    FullAdder(a=a[12],b=b[12],c=carry12,sum=out[12],carry=carry13);
    FullAdder(a=a[13],b=b[13],c=carry13,sum=out[13],carry=carry14);
    FullAdder(a=a[14],b=b[14],c=carry14,sum=out[14],carry=carry15);
    FullAdder(a=a[15],b=b[15],c=carry15,sum=out[15],carry=carry16);
        */
        var sum = [];
        var carry;
        sum[0] = this.halfAdder(a[0], b[0])[0];
        carry = this.halfAdder(a[0], b[0])[1];

        for (var i = 1; i <= 15; i++) {
            sum[i] = this.fullAdder(a[i], b[i], carry)[0];
            carry = this.fullAdder(a[i], b[i], carry)[1];
        }
        return sum;
    }
}

My gates looks like the following:

function Gate() {
    this.NAND = function(a, b) {
        if (a == 1 && b == 1) return 0;
        else return 1;
    };

    this.NOT = function(a) {
        return this.NAND(a, a);
    };

    this.AND = function(a, b) {
        return this.NOT(this.NAND(a, b));
    };

    this.OR = function(a, b) {
        return this.NOT(this.AND(this.NOT(a), this.NOT(b)));
    };

    this.XOR = function(a, b) {
        return this.OR(this.AND(a, this.NOT(b)), this.AND(this.NOT(a), b));
    };
}

My half adder and full adder work, they passed all the unit tests provided by the creators of the course but for my 16 bit adder not. The unit tests are these:

describe('adder 16 bit tests', function() {

    it('adder of a = 0000000000000000 and b = 0000000000000000 should be out = 0000000000000000', function() {
        var adder = new Adder();
        var a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        var b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        var out = adder.Adder16(a, b);
        var result = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        assert.deepEqual(result, out);
    });

    it('adder of a = 0000000000000000 and b = 1111111111111111 should be out = 1111111111111111', function() {
        var adder = new Adder();
        var a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        var b = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        var out = adder.Adder16(a, b);
        var result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        assert.deepEqual(result, out);
    });

    it('adder of a = 1111111111111111 and b = 1111111111111111 should be out = 1111111111111110', function() {
        var adder = new Adder();
        var a = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        var b = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        var out = adder.Adder16(a, b);
        var result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0];
        assert.deepEqual(result, out);
    });

    it('adder of a = 1010101010101010 and b = 0101010101010101 should be out = 1111111111111111', function() {
        var adder = new Adder();
        var a = [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0];
        var b = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1];
        var out = adder.Adder16(a, b);
        var result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        assert.deepEqual(result, out);
    });

    it('adder of a = 0011110011000011 and b = 0000111111110000 should be out = 0100110010110011', function() {
        var adder = new Adder();
        var a = [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1];
        var b = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0];
        var out = adder.Adder16(a, b);
        var result = [0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1];
        console.log(out);
        assert.deepEqual(result, out);
    });

    it('adder of a = 0001001000110100 and b = 1001100001110110 should be out = 1010101010101010', function() {
        var adder = new Adder();
        var a = [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0];
        var b = [1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0];
        var out = adder.Adder16(a, b);
        var result = [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0];
        assert.deepEqual(result, out);
    });
});

The unit tests for the other gates and adders pass.

John
  • 728
  • 2
  • 15
  • 37
  • 1
    Not certain what Question is? Are you familiar with boolean algebra? – guest271314 Oct 18 '17 at 13:52
  • Yes, I was a long time ago! The problem is that my 16 bit adders does not pass the unit tests and i can't figure out why. – John Oct 18 '17 at 13:54
  • Show us what is your `Gate`. – Walk Oct 18 '17 at 13:55
  • Can you include the full code, expected result and tests run at a stacksnippets at Question? See https://stackoverflow.com/help/mcve – guest271314 Oct 18 '17 at 13:56
  • I put the code from the gates and the unit tests for the 16 bit adder. If you need more let me know! :) – John Oct 18 '17 at 14:02
  • I made a quick fiddle here: https://jsfiddle.net/q0bt2f5e/ As you can see it doesn't utilise your carry. – Walk Oct 18 '17 at 14:16
  • Actually, I was mistaken and put those '1' into the most significant bits so that's not it :) – Walk Oct 18 '17 at 16:24
  • Actually, I was mistaken and put those '1' into the most significant bits so that's not it :) Here's a little bit more versobe version of fiddle above, I'm still not sure where the problem is https://jsfiddle.net/q0bt2f5e/1/ – Walk Oct 18 '17 at 16:46

0 Answers0