#include "modMul.h"
#include "RessourceHandler.cpp"

void ModMulModule::exe(){
	while(true){

		// Führe Berechnung erst aus, sobald entsprechendes Signal gesetzt
		while(en->read()==false){
			wait();
		}

		// 1.Clock Cycle: Initialisiere interne Register

		// Interne Register
		sc_biguint<160> U = 0;

		// Input Register
		sc_biguint<160> V = x->read();
		sc_biguint<160> A = y->read();
		sc_biguint<160> P = m->read();


		// n-th Clock Cycle: Berechne Teilprodukte gemäß schriftlicher Multiplikation
		while(A!=0){
			if(A[0]==1){
				U = U + V;
			}

			wait();
			A >>= 1;
			V <<= 1;
			if(U>=P){
				U = U - P;
			}

			wait();
			if(V>=P){
				V = V - P;
			}

			wait();
		}

		// Write Ausgabewerte auf Ausgang
		out->write(U);
		done->write(true);

		wait();

		// en-Signal muss mindestens einmal vorher resetted werden 
		while(en->read()==true){
			wait();
		}
		done->write(false);
		wait();

	}
}