diff options
Diffstat (limited to 'src/jcgp/backend/function/DigitalCircuitFunctions.java')
-rw-r--r-- | src/jcgp/backend/function/DigitalCircuitFunctions.java | 504 |
1 files changed, 504 insertions, 0 deletions
diff --git a/src/jcgp/backend/function/DigitalCircuitFunctions.java b/src/jcgp/backend/function/DigitalCircuitFunctions.java new file mode 100644 index 0000000..31cdf17 --- /dev/null +++ b/src/jcgp/backend/function/DigitalCircuitFunctions.java @@ -0,0 +1,504 @@ +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"; + } + } +} |