/*******************************************************************************
 * Author: Ahmed Kosba <[email protected]>
 *******************************************************************************/
package circuit.operations.primitive;

import java.math.BigInteger;

import circuit.config.Config;
import circuit.structure.Wire;

public class SplitBasicOp extends BasicOp {

	public SplitBasicOp(Wire w, Wire[] outs, String...desc) {
		super(new Wire[] { w }, outs, desc);
	}

	public String getOpcode(){
		return "split";
	}
	
	protected void checkInputs(BigInteger[] assignment) {
		super.checkInputs(assignment);
		if (outputs.length < assignment[inputs[0].getWireId()].bitLength()) {
			System.err
					.println("Error in Split --- The number of bits does not fit -- Input: "
							+ assignment[inputs[0].getWireId()].toString(16) + "\n\t" + this);

			throw new RuntimeException("Error During Evaluation -- " + this);
		}
	}

	@Override
	protected void compute(BigInteger[] assignment) {

		BigInteger inVal = assignment[inputs[0].getWireId()];
		if (inVal.compareTo(Config.FIELD_PRIME) > 0) {
			inVal = inVal.mod(Config.FIELD_PRIME);
		}
		for (int i = 0; i < outputs.length; i++) {
			assignment[outputs[i].getWireId()] = inVal.testBit(i) ? BigInteger.ONE
					: BigInteger.ZERO;
		}
	}

	@Override
	public boolean equals(Object obj) {

		if (this == obj)
			return true;
		if (!(obj instanceof SplitBasicOp)) {
			return false;
		}
		SplitBasicOp op = (SplitBasicOp) obj;
		return inputs[0].equals(op.inputs[0]) && outputs.length == op.outputs.length;

	}
	
	@Override
	public int getNumMulGates() {
		return outputs.length + 1;
	}

}