/**
 * The first module of Hack's CU (Control Unit)
 * decodes and executes instructions
 */

CHIP cuDecEx {
    IN instruction[13]; // Instruction[3..15] to be decoded and executed
    
    OUT isAinstruction,
        loadA,
        loadD,
        selAM,
        controlBits[6],
        writeM;
    
    PARTS:
    // isAinstruction
    Not(in=instruction[12]/*=i*/, out=isAinst);
    And(a=isAinst, b=isAinst, out=isAinstruction);

    // selAM
    And(a=instruction[9]/*=a*/, b=instruction[9]/*a*/, out=selAM);

    // controlBits
    And(a=instruction[8], b=instruction[8], out=controlBits[0]);
    And(a=instruction[7], b=instruction[7], out=controlBits[1]);
    And(a=instruction[6], b=instruction[6], out=controlBits[2]);
    And(a=instruction[5], b=instruction[5], out=controlBits[3]);
    And(a=instruction[4], b=instruction[4], out=controlBits[4]);
    And(a=instruction[3], b=instruction[3], out=controlBits[5]);

    // loadA
    Or(a=instruction[2]/*=d1*/, b=isAinst, out=loadA);

    // loadD
    And(a=instruction[12]/*=i*/, b=instruction[1]/*=d2*/, out=loadD);

    // writeM
    And(a=instruction[12]/*=i*/, b=instruction[0]/*=d3*/, out=writeM);
}