diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp index c3d12c6d68a2ef1e819a531e17e1f017f595d219..f175b43df763c98f04a8207188c506708575caa2 100644 --- a/simulators/c++2/src_simulator/arch/FPGA.cpp +++ b/simulators/c++2/src_simulator/arch/FPGA.cpp @@ -212,7 +212,7 @@ TMLTime FPGA::truncateNextTransAt(TMLTime iTime){ std::cout<<"fpga truncateNextTransAt"<<std::endl; if (_masterNextTransaction==0){ if (iTime <= _nextTransaction->getStartTime()) return 0; //before: <= - float timeExec = _cyclesPerExeci; + unsigned int timeExec = _cyclesPerExeci; //std::cout << "CPU: EXECI or EXECC??" << "\n"; if( (_nextTransaction->getCommand() != 0) && (_nextTransaction->getCommand()->getExecType() == 1) ) { //std::cout << "CPU: EXECC" << "\n"; @@ -285,7 +285,7 @@ std::cout<<"fpga addTransaction"<<std::endl; } } unsigned int _tempReconfigNumber = _reconfigNumber - _highestRank; - float timeExec = _cyclesPerExeci; + unsigned int timeExec = _cyclesPerExeci; //std::cout << "CPU: EXECI or EXECC??" << "\n"; if( (_nextTransaction->getCommand() != 0) && (_nextTransaction->getCommand()->getExecType() == 1) ) { //std::cout << "CPU: EXECC" << "\n"; diff --git a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp index 50d040cd435280c08f4e4dff8cec4b529adf4e60..f15b0b7dbd07bd31df0b97f973ef31287128f988 100644 --- a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp +++ b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp @@ -46,6 +46,7 @@ #include <Slave.h> #include <TMLChannel.h> #include <RRPrioScheduler.h> +#include <math.h> MultiCoreCPU::MultiCoreCPU(ID iID, @@ -223,13 +224,9 @@ std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nex //calculate length of transaction //if (_nextTransaction->getOperationLength()!=-1){ if (iTimeSlice!=0){ - //_nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(iTimeSlice / timeExec)), (TMLTime)1)); - float nb_ExecF = iTimeSlice /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(min(_nextTransaction->getVirtualLength(), nb_ExecI)); + _nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(ceil(iTimeSlice / timeExec))), (TMLTime)1)); } - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #ifdef BUS_ENABLED } @@ -256,7 +253,7 @@ void MultiCoreCPU::truncateAndAddNextTransAt(TMLTime iTime){ //return truncateNextTransAt(iTime); //not a problem if scheduling does not take place at time when transaction is actually truncated, tested //std::cout << "CPU:truncateAndAddNextTransAt " << _name << "time: +++++++++++++++++++++" << iTime << "\n"; - if(false){ + if(true){ if (_nextTransaction->getTransType()==NOCOMM_TRANS){ TMLTime aTimeSlice = _scheduler->schedule(iTime); //_schedulingNeeded=false; 05/05/11 @@ -303,22 +300,14 @@ TMLTime MultiCoreCPU::truncateNextTransAt(TMLTime iTime){ #endif }else{ aNewDuration-=aStaticPenalty; - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); } #else if (iTime <= _nextTransaction->getStartTime()) return 0; //before TMLTime aNewDuration = iTime - _nextTransaction->getStartTime(); - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #endif #ifdef DEBUG_CPU std::cout << "aNewDuration: " << aNewDuration << std::endl; @@ -401,22 +390,14 @@ void MultiCoreCPU::truncateNextTrans(TMLTime iTime){ // called with _nextTransac #endif } else{ aNewDuration-=aStaticPenalty; - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); } #else //if (iTime <= _nextTransaction->getStartTime()) return 0; //before: <= TMLTime aNewDuration = iTime - _nextTransaction->getStartTime(); - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #endif #ifdef DEBUG_CPU std::cout << "aNewDuration: " << aNewDuration << std::endl; diff --git a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp index ebfd5a29d44b30cfb10aa14400d9fc12ff519522..f43a14c3647ffa2ac8e8b5455dad09c78fef27b4 100644 --- a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp +++ b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp @@ -45,6 +45,7 @@ #include <Bus.h> #include <Slave.h> #include <TMLChannel.h> +#include <math.h> //#include <TransactionListener.h> @@ -182,13 +183,9 @@ void SingleCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){ //calculate length of transaction //if (_nextTransaction->getOperationLength()!=-1){ if (iTimeSlice!=0){ - //_nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(iTimeSlice / timeExec)), (TMLTime)1)); - float nb_ExecF = iTimeSlice /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(min(_nextTransaction->getVirtualLength(), nb_ExecI)); + _nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(ceil(iTimeSlice / timeExec))), (TMLTime)1)); } - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #ifdef BUS_ENABLED } @@ -218,7 +215,7 @@ void SingleCoreCPU::truncateAndAddNextTransAt(TMLTime iTime){ //return truncateNextTransAt(iTime); //not a problem if scheduling does not take place at time when transaction is actually truncated, tested //std::cout << "CPU:truncateAndAddNextTransAt " << _name << "time: +++++++++++++++++++++" << iTime << "\n"; - if(false){ + if(true){ if (_nextTransaction->getTransType()==NOCOMM_TRANS){ TMLTime aTimeSlice = _scheduler->schedule(iTime); //_schedulingNeeded=false; 05/05/11 @@ -266,22 +263,14 @@ TMLTime SingleCoreCPU::truncateNextTransAt(TMLTime iTime){ #endif } else{ aNewDuration-=aStaticPenalty; - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); } #else if (iTime <= _nextTransaction->getStartTime()) return 0; //before: <= TMLTime aNewDuration = iTime - _nextTransaction->getStartTime(); - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #endif #ifdef DEBUG_CPU std::cout << "aNewDuration: " << aNewDuration << std::endl; @@ -364,22 +353,14 @@ void SingleCoreCPU::truncateNextTrans(TMLTime iTime){ // called with _nextTransa #endif } else{ aNewDuration-=aStaticPenalty; - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); } #else //if (iTime <= _nextTransaction->getStartTime()) return 0; //before: <= TMLTime aNewDuration = iTime - _nextTransaction->getStartTime(); - //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1)); - float nb_ExecF = aNewDuration /timeExec; //must not be 0 - TMLLength nb_ExecI = (TMLLength) nb_ExecF; - if(nb_ExecI<nb_ExecF) nb_ExecI++; - _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1)); - _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec); + _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1)); + _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec)); #endif #ifdef DEBUG_CPU std::cout << "aNewDuration: " << aNewDuration << std::endl;