package jcgp.backend.function; public class DigitalCircuitFunctions extends FunctionSet { public DigitalCircuitFunctions() { name = "32-bit Logic"; functionList = new Function[]{ new ConstantZero(), new ConstantOne(), new WireA(), new WireB(), new NotA(), new NotB(), new And(), new AndNotA(), new AndNotB(), new Nor(), new Xor(), new Xnor(), new Or(), new OrNotA(), new OrNotB(), new Nand(), new Mux1(), new Mux2(), new Mux3(), new Mux4() }; enableAll(); } public static class ConstantZero extends Function { @Override public UnsignedInteger run(Object... args) { return new UnsignedInteger(0); } @Override public int getArity() { return 0; } @Override public String toString() { return "0"; } } public static class ConstantOne extends Function { @Override public UnsignedInteger run(Object... args) { return new UnsignedInteger(0xFFFF); } @Override public int getArity() { return 0; } @Override public String toString() { return "1"; } } public static class WireA extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { return ((UnsignedInteger) args[0]); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Wire A"; } } public static class WireB extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { return ((UnsignedInteger) args[1]); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Wire B"; } } public static class NotA extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { return new UnsignedInteger(~((UnsignedInteger) args[0]).get()); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Not A"; } } public static class NotB extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { return new UnsignedInteger(~((UnsignedInteger) args[1]).get()); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Not B"; } } public static class And extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() & in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "And"; } } public static class AndNotA extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = ~(in0.get()) & in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "And !A"; } } public static class AndNotB extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() & ~(in1.get()); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "And !B"; } } public static class Nor extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() | in1.get(); return new UnsignedInteger(~result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Nor"; } } public static class Xor extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() ^ in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Xor"; } } public static class Xnor extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() ^ in1.get(); return new UnsignedInteger(~result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Xnor"; } } public static class Or extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() | in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Or"; } } public static class OrNotA extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = ~in0.get() | in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Or !A"; } } public static class OrNotB extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() | ~in1.get(); return new UnsignedInteger(result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Or !B"; } } public static class Nand extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); Integer result = in0.get() & in1.get(); return new UnsignedInteger(~result); } } @Override public int getArity() { return 2; } @Override public String toString() { return "Nand"; } } public static class Mux1 extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); UnsignedInteger in2 = ((UnsignedInteger) args[2]); Integer result = ((in0.get() & ~in2.get()) | (in1.get() & in2.get())); return new UnsignedInteger(result); } } @Override public int getArity() { return 3; } @Override public String toString() { return "Mux1"; } } public static class Mux2 extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); UnsignedInteger in2 = ((UnsignedInteger) args[2]); Integer result = ((in0.get() & ~in2.get()) | (~in1.get() & in2.get())); return new UnsignedInteger(result); } } @Override public int getArity() { return 3; } @Override public String toString() { return "Mux2"; } } public static class Mux3 extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); UnsignedInteger in2 = ((UnsignedInteger) args[2]); Integer result = ((~in0.get() & ~in2.get()) | (in1.get() & in2.get())); return new UnsignedInteger(result); } } @Override public int getArity() { return 3; } @Override public String toString() { return "Mux3"; } } public static class Mux4 extends Function { @Override public UnsignedInteger run(Object... args) { if (args.length < getArity()) { throw new IllegalArgumentException(toString() + " received " + args.length + " in but arity is " + getArity() + "."); } else { UnsignedInteger in0 = ((UnsignedInteger) args[0]); UnsignedInteger in1 = ((UnsignedInteger) args[1]); UnsignedInteger in2 = ((UnsignedInteger) args[2]); Integer result = ((~in0.get() & ~in2.get()) | (~in1.get() & in2.get())); return new UnsignedInteger(result); } } @Override public int getArity() { return 3; } @Override public String toString() { return "Mux4"; } } }