aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/backend/function/DigitalCircuitFunctions.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/backend/function/DigitalCircuitFunctions.java')
-rw-r--r--src/jcgp/backend/function/DigitalCircuitFunctions.java504
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";
+ }
+ }
+}