#include "modSub.h"
#include <iostream>
#include "RessourceHandler.cpp"

void ModSubModule::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_bigint<161> U1 = 0; // Deklariert als sc_bigint<161>, um möglichen Überlauf zu vermeiden
		sc_biguint<160> U2 = 0;

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

		wait();

		// 2.Clock Cycle: Berechne "x-y"
		U1 = V - A;
		wait();

		// 3.Clock Cycle: 
		// Falls "x-y<0, dann addiere m hinzu"
		if(U1<0){ 
			U2 = U1 + P;
		}
		else {
			U2 = U1;
		}

		wait();

		// 4th Clock Cycle
		// Write Ausgabewerte
		out->write(U2);
		done->write(true);

		wait();

		// 5th Clock Cycle
		// en-Signal muss mindestens einmal vorher nach Bekanntgabe des Ergebnisses 
		// zurückgesetzt werden, bevor das Modul wieder seinen Ausgangszustand einnimmt.
		while(en->read()==true){
			
			wait();
		}
		done->write(false);
		wait();
	}

}