#ifndef MODDIV_H
#define MODDIV_H

#include <systemc.h>
#include "modInv.h"
#include "modMul.h"

SC_MODULE(ModDivModule){

	/// Eingangsports

	// first input
	sc_in<sc_biguint<160> > x;

	// second input
	sc_in<sc_biguint<160> > y;

	// modulo value
	sc_in<sc_biguint<160> > m;

	// enable
	sc_in<bool> en;

	// clock
	sc_in<bool> clk;


	/// Ausgangsports
	sc_out<sc_biguint<160> > out;
	sc_out<bool> done;

	/// Interne Signale
	sc_signal<sc_biguint<160> > mod_inv_out_sig;
	sc_signal<bool> mod_inv_done_sig;
	sc_signal<bool> mod_mul_en_sig;

	/// Module
	ModInvModule mod_inv;
	ModMulModule mod_mul;


	// Simulation processes
	void exe();

	int mode;
	SC_HAS_PROCESS(ModDivModule);
	ModDivModule(sc_module_name name, int mode): sc_module(name), mod_inv("mod_inv", mode), mod_mul("mod_mul", mode){
		this->mode = mode;
		// Connect all Ports of internal Modules
		mod_inv.clk(clk);
		mod_mul.clk(clk);

		mod_mul.x(x);

		// mod_inv_out_sig
		mod_inv.y(y);
		mod_inv.out(mod_inv_out_sig);
		mod_mul.y(mod_inv_out_sig);

		mod_mul.m(m);
		mod_inv.m(m);

		// mod_inv_done_sig
		mod_inv.en(en);
		mod_inv.done(mod_inv_done_sig);
		mod_mul.en(mod_mul_en_sig);

		mod_mul.out(out);
		mod_mul.done(done);

		SC_THREAD(exe);
		sensitive << clk;
	}

};

#endif