this repo has no description
1var R_INSTRUCTION_PARSER = /^([0-9a-z]+)?\s*([A-Z]+)?\s*([0-9a-z]+)?\s+\->\s+([a-z]+)$/;
2
3var wires = {};
4
5module.exports = {
6
7 processInstruction: function(instruction) {
8 if (!instruction.match(R_INSTRUCTION_PARSER)) return;
9 var parts = this.parseParts(instruction);
10 this.registerWire(parts);
11 },
12
13 parseParts: function(instruction) {
14 var parts = instruction.match(R_INSTRUCTION_PARSER);
15
16 parts[1] = convertToNumberIfNumber(parts[1]);
17 parts[3] = convertToNumberIfNumber(parts[3]);
18
19 var returnObj = {
20 // convert missing input1 to null instead of undefined
21 input1: typeof(parts[1]) === 'undefined' ? null : parts[1],
22 input2: typeof(parts[3]) === 'undefined' ? null : parts[3],
23 operation: typeof(parts[2]) === 'undefined' ? null : parts[2],
24 output: parts[4]
25 };
26
27 return returnObj;
28 },
29
30 registerWire: function(parts) {
31 wires[parts.output] = function() {
32 var getInput1 = useNumberOrWireInput(parts.input1);
33 var getInput2 = useNumberOrWireInput(parts.input2);
34
35 var result;
36
37 if (parts.operation !== 'NOT') {
38 switch(parts.operation) {
39 case 'AND': result = getInput1() & getInput2(); break;
40 case 'OR': result = getInput1() | getInput2(); break;
41 case 'LSHIFT': result = getInput1() << getInput2(); break;
42 case 'RSHIFT': result = getInput1() >> getInput2(); break;
43 case null: result = getInput1(); break;
44 }
45 } else {
46 result = getInput2() ^ 65535
47 }
48
49 wires[parts.output] = function() { return result };
50 return result;
51 };
52 },
53
54 getWireSignal: function(wire) {
55 return wires[wire]();
56 },
57
58 setSignal: function(wire, signal) {
59 wires[wire] = function() { return signal };
60 },
61
62 resetWires: function() {
63 wires = {};
64 }
65
66};
67
68function convertToNumberIfNumber(x) {
69 return parseInt(x) == x ? parseInt(x) : x;
70}
71
72function useNumberOrWireInput(input) {
73 if (typeof(input) === 'number') {
74 return function() { return input };
75 } else {
76 return function() { return wires[input]() };
77 }
78}