// © Copyright 1999, Joseph Bergin.  All rights reserved. package gates;public class Circuit{	public boolean [] output()	{	if(outputGates.length < outputs) return null;		boolean [] result = new boolean[outputs];		for(int i = 0; i < outputs; ++i)			if( outputGates[i] != null)				result[i] = outputGates[i].output();			else				result[i] = false;		return result;	}		public Gate output(int n)	{	if(n >= outputGates.length) return null;		return outputGates[n];	}		public Circuit(int outputs)	{	if(outputs < 1) outputs = 1;		this.outputs = outputs;		outputGates = new Gate[outputs];	}		public void connectOutput(Gate g)	{	if(nextFreeOutput < outputs)			outputGates[nextFreeOutput++] = g;	}		private int outputs = 1;	private Gate [] outputGates = null;	private int nextFreeOutput = 0;}class Adder extends Circuit{	public Adder(Gate in1, Gate in2)	{	super(2);		NotGate flipLeft = new NotGate(in1);		NotGate flipRight = new NotGate(in2);		AndGate left = new AndGate(in1, flipRight);		AndGate right = new AndGate(in2, flipLeft);		OrGate combine = new OrGate(left, right);		AndGate carry = new AndGate(in1, in2);				connectOutput(combine);			connectOutput(carry);	}}