From 8807c35eaeeaf6f92a8f23a4edf8c1523accc389 Mon Sep 17 00:00:00 2001 From: Sophie Coudert <sophie.coudert@telecom-paris.fr> Date: Thu, 10 Mar 2022 16:21:27 +0100 Subject: [PATCH] round some time values with ceil, better than floor --- simulators/c++2/src_simulator/arch/FPGA.cpp | 4 +- .../c++2/src_simulator/arch/MultiCoreCPU.cpp | 43 ++++++------------- .../c++2/src_simulator/arch/SingleCoreCPU.cpp | 43 ++++++------------- 3 files changed, 26 insertions(+), 64 deletions(-) diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp index c3d12c6d68..f175b43df7 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 50d040cd43..f15b0b7dbd 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 ebfd5a29d4..f43a14c364 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; -- GitLab