package Components;


import Signal.signal;


public class ALU
{
	public int zero =0;
	public String name;

	/**********
	 * Signal.signal op = Signal.signal for the opcode........
	 * Signal.signal i1 = ALUsrc A
	 * Signal.signal i2 = ALUsrc B
	 * Signal.signal out = Signal.signal in which the value has to be put......
	 **********/


	public void alu(signal op,signal i1,signal i2, signal out, signal z,signal overflow)
	{
		int con = op.content.B_DU();  // control
		int in1 = i1.content.B_D();  // reg A
		int in2 = i2.content.B_D();  // reg B
		int outval;
		int oflow;
        zero=0;
        oflow =0;
        //System.out.println("in1="+in1);

       // System.out.println("in2="+in2);
        //System.out.println("con="+con);
		switch(con)
		{
			case(0):    outval = in1 & in2;		//AND..............
				    break;
			case(1):    outval = in1 | in2;		// OR..............
				    break;
			case(2):
				   // System.out.println("in1="+in1);
			//System.out.println("in2="+in2);
				    outval = in1 + in2;		// ADD.............
					if(in1 > 0 & in2 > 0 & outval <0) 
					{
						oflow = 1;
					}
					if(in1 <0 & in2 < 0 & outval >0)
					{
						oflow = 1;
					}
				    break;
			case(6):    outval = in1 - in2; 	// SUBTRACT........
			            if (outval==0) zero = 1;
			            if(in1 > 0 & in2 <0 & outval <0)
			            {
			            	oflow = 1;
			            }
			            if(in1 <0 & in2 >0 & outval > 0)
			            {
			            	oflow = 1;
			            }
				    break;
			case(7):    if(in1 < in2) outval = 1;	// SLT.............
					    else outval = 2;
			        break;
			default :   outval =0;
		};

		//System.out.println("in1= " + in1 + ",in2 =" + in2+ ",outval="+outval);
		z.update(z.content.D_B(zero));
		out.update(out.content.D_B(outval));
		int t[] = new int[1];
			t[0] = oflow;
			overflow.update(t);
	}


	/**********
	 * the function which performs the function of....... 
	 * addition..........
	 * subtraction.......
	 * slt...............
	 **********/

	public void adder(signal i1, signal i2, signal out)
	{
		int in1 = i1.content.B_D();
		int in2 = i2.content.B_D();
		out.update(out.content.D_B(in1 + in2));
	}

	public void subtractor(signal i1, signal i2, signal out)
	{
		int in1 =i1.content.B_D(); 
		int in2 =i2.content.B_D(); 
		out.update(out.content.D_B(in1 - in2));
	}

	public void comparator(signal i1, signal i2, signal out)
	{
		//int in1 =i1.content.B_D(); 
		//int in2 =i2.content.B_D(); 
		int i;
		if(i1 == i2) i = 1 ;
		else i = 0;
		out.update(out.content.D_B(i)); 
	}
}
