jtulach@52: package org.netbeans.apifest.boolcircuit; jtulach@52: jtulach@52: /** jtulach@52: * Representation of an element in the circuit. jtulach@132: * The internal behaviour of the element is opaque to the API user, jtulach@132: * it can only be used as a building block for logical equations, jtulach@132: * using primitive operation factories and a factory for input jtulach@132: * pin representation. jtulach@132: * Elements are chained to create the logical net. jtulach@132: * The inputs to the net are represented by the elements created jtulach@132: * by {@link #createInput(boolean[])} factory method. jtulach@52: */ jtulach@52: public abstract class Element { jtulach@52: jtulach@52: /** Creates a new instance of Element */ jtulach@52: private Element() { jtulach@52: } jtulach@52: jtulach@52: /** jtulach@52: */ jtulach@52: abstract double evaluate(double[] inputs); jtulach@52: jtulach@52: abstract int maxInput(); jtulach@52: jtulach@52: /** jtulach@52: * Creates an Element representing 2-input AND function. jtulach@52: * jtulach@52: */ jtulach@132: public static Element createAnd( jtulach@132: final Element source1, final Element source2 jtulach@132: ) { jtulach@52: return new Element() { jtulach@52: double evaluate(double[] inputs) { jtulach@52: return source1.evaluate(inputs) * source2.evaluate(inputs); jtulach@52: } jtulach@52: jtulach@52: int maxInput() { jtulach@52: return Math.max(source1.maxInput(), source2.maxInput()); jtulach@52: } jtulach@52: }; jtulach@52: } jtulach@52: jtulach@52: /** jtulach@52: * Creates an Element representing 2-input OR function. jtulach@52: * jtulach@52: */ jtulach@132: public static Element createOr( jtulach@132: final Element source1, final Element source2 jtulach@132: ) { jtulach@52: return new Element() { jtulach@52: double evaluate(double[] inputs) { jtulach@52: double x = source1.evaluate(inputs); jtulach@52: double y = source2.evaluate(inputs); jtulach@52: return 1 - (1 - x)*(1-y); jtulach@52: } jtulach@52: jtulach@52: int maxInput() { jtulach@52: return Math.max(source1.maxInput(), source2.maxInput()); jtulach@52: } jtulach@52: }; jtulach@52: } jtulach@52: jtulach@52: /** jtulach@52: * Creates an Element representing negation. jtulach@52: * jtulach@52: */ jtulach@52: public static Element createNot(final Element source1) { jtulach@52: return new Element() { jtulach@52: double evaluate(double[] inputs) { jtulach@52: return 1 - source1.evaluate(inputs); jtulach@52: } jtulach@52: jtulach@52: int maxInput() { jtulach@52: return source1.maxInput(); jtulach@52: } jtulach@52: }; jtulach@52: } jtulach@52: jtulach@52: /** jtulach@52: * Creates an Element representing input to the logical net. jtulach@52: * jtulach@52: */ jtulach@52: public static Element createInput(final int pin) { jtulach@52: return new Element() { jtulach@52: double evaluate(double[] inputs) { jtulach@52: return inputs[pin]; jtulach@52: } jtulach@52: jtulach@52: int maxInput() { jtulach@52: return pin; jtulach@52: } jtulach@52: }; jtulach@52: } jtulach@52: jtulach@59: // BEGIN: apifest.day2.pinbasedsolution.FunctionFactory jtulach@52: /** jtulach@52: * Creates an Element with user-defined transfer function. jtulach@52: */ jtulach@132: public static Element createGate( jtulach@132: final Element source1, final Element source2, final Function function jtulach@132: ) { jtulach@52: return new Element() { jtulach@52: double evaluate(double[] inputs) { jtulach@52: double x = source1.evaluate(inputs); jtulach@52: double y = source2.evaluate(inputs); jtulach@52: double result = function.evaluate(x, y); jtulach@132: if (result < 0.0 || result > 1.0) { jtulach@132: throw new InternalError("Illegal gate function"); jtulach@132: } jtulach@52: return result; jtulach@52: } jtulach@52: jtulach@52: int maxInput() { jtulach@52: return Math.max(source1.maxInput(), source2.maxInput()); jtulach@52: } jtulach@52: }; jtulach@52: } jtulach@59: // END: apifest.day2.pinbasedsolution.FunctionFactory jtulach@52: }