www.pudn.com > noc.rar > alu.cpp


/*
 *  TU Eindhoven
 *  Eindhoven, The Netherlands
 *
 *  Name            :   alu.cc
 *
 *  Author          :   Sander Stuijk (sander@ics.ele.tue.nl)
 *
 *  Date            :   July 23, 2002
 *
 *  Function        :   Arithmetic  Logic Unit
 *
 *  History         :
 *      23-07-02    :   Initial version.
 *      13-12-02    :   Synthesizable version A.S.Slusarczyk@tue.nl
 *
 */

#include "alu.h"
 
void ALU::alu_thread()
{
	sc_bv 			result;
	sc_bv<1> 				zero, sign;
	sc_uint 			s;
	sc_uint 			t;
	sc_uint		ctrl_t;
	sc_bv<2> sign2(0);
	sc_bv<8> sign8(0);
	
	//-> while (true) {
		#ifdef VERBOSE
			clog << "ALU" << endl;
		#endif
		
		// Read the inputs
		s = a.read();
		t = b.read();
		ctrl_t = ctrl.read();

		result = 0;
		// Calculate result using selected operation
		switch (ctrl_t) {
			case 0x0:	// And
						result = s & t;
						break;

			case 0x1:	// Or
						result = s | t;
						break;

			case 0x2:	// Add
						result = sc_int(s) + sc_int(t);
						break;

			case 0x3:	// Add unsigned
						result = s + t;
						break;
						
			case 0x4:	// Xor
						result = s ^ t;
						break;
						
			case 0x6:	// Subtract unsigned 
						result = s - t;
						break;

			case 0x7:	// Set-on-less-than
						if (sc_int(s) < sc_int(t))
							result = 1;
						else
							result = 0;
						break;
			
			case 0x8:	// Set-on-less-than unsigned
						if (s < t)
							result = 1;
						else
							result = 0;
						break;
			
			case 0x9:	// Load upper immediate
						result = t << 16;
						break;
			
			case 0xA:	// SLL (1 bit)
						result = t << 1;
						break;

			case 0xB:	// SLL (2 bit)
						result = t << 2;
						break;
						
			case 0xC:	// SLL (8 bit)
						result = t << 8;
						break;

			case 0xD:	// SRL (1 bit)
						result = t >> 1;
						break;

			case 0xE:	// SRL (2 bit)
						result = t >> 2;
						break;

			case 0xF:	// SRL (8 bit)
						result = t >> 8;
						break;

			case 0x10:	// SRA (1 bit)
						sign = t.range(DWORD-1,DWORD-1);
						result = t >> 1;
						result.range(DWORD-1,DWORD-1) = sign;
						break;

			case 0x11:	// SRA (2 bit)
						sign = t.range(DWORD-1,DWORD-1);
						result = t >> 2;
						result.range(DWORD-1,DWORD-2) = (sign, sign);
						break;

			case 0x12:	// SRA (8 bit)
						sign = t.range(DWORD-1,DWORD-1);
						result = t >> 8;
                        for(int i=0; i<8; i++) sign8[i] = sign[0];
						result.range(DWORD-1,DWORD-8) = sign8;
						break;
		}

		// Calculate the zero output
		if (sc_uint(result) == 0)
			zero = 1;
		else
			zero = 0;

		// Write results to output
		r.write(result);
		z.write(zero);
		
		// Wait for next event
		//-> wait();
//-> 	}
}