From 4dcbfb26d5fc00ec7109a046feb5bee9059da282 Mon Sep 17 00:00:00 2001
From: Le Van Truong <le.truong@telecom-paris.fr>
Date: Thu, 24 Sep 2020 18:59:03 +0200
Subject: [PATCH] fix core dump

---
 .../src_simulator/arch/ReconfigScheduler.cpp  | 37 ++++++++++++++-----
 1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/simulators/c++2/src_simulator/arch/ReconfigScheduler.cpp b/simulators/c++2/src_simulator/arch/ReconfigScheduler.cpp
index 6f17bf89ec..3b32f0a52a 100644
--- a/simulators/c++2/src_simulator/arch/ReconfigScheduler.cpp
+++ b/simulators/c++2/src_simulator/arch/ReconfigScheduler.cpp
@@ -46,6 +46,7 @@ ReconfigScheduler::ReconfigScheduler(const std::string& iName, Priority iPrio, c
 ReconfigScheduler::ReconfigScheduler(const std::string& iName, Priority iPrio, WorkloadSource** aSourceArray, unsigned int iNbOfSources, const std::string iTaskOrder): WorkloadSource(iPrio, aSourceArray, iNbOfSources), _name(iName), _taskOrder(iTaskOrder), _nextTransaction(0), _lastSource(0), _tempWorkloadList(0), _indexMark(0), _reconfigNumber(0) {
 }
 Priority currentRank = 0;
+Priority minRank = 0;
 TMLTime ReconfigScheduler::schedule(TMLTime iEndSchedule){
   std::cout<<"reconfig scheduler"<<std::endl;
 	TaskList::iterator i;
@@ -103,6 +104,17 @@ TMLTime ReconfigScheduler::schedule(TMLTime iEndSchedule){
     Priority aHighestPrioPast=-1;
     bool isFirstRankSelected = false;
 	for(WorkloadList::iterator i = _workloadList.begin(); i != _workloadList.end(); ++i){
+	    for(WorkloadList::iterator j = _workloadList.begin(); j != _workloadList.end(); ++j){
+	        aTempTrans = (*j)->getNextTransaction(iEndSchedule);
+            if(aTempTrans != 0) {
+                if(!isFirstRankSelected) {
+                    minRank = (*j)->getPriority(); //min(minRank, (*j)->getPriority());
+                    isFirstRankSelected = true;
+                } else {
+                    minRank = min(minRank, (*j)->getPriority());
+                }
+            }
+	    }
 #ifdef DEBUG_FPGA
 	  std::cout<<"schedule for"<<std::endl;
 #endif
@@ -110,7 +122,7 @@ TMLTime ReconfigScheduler::schedule(TMLTime iEndSchedule){
 	  aTempTrans=(*i)->getNextTransaction(iEndSchedule);
 	  if(aTempTrans==0) std::cout<< (*i)->toString() + "temp trans is 0"<<std::endl;
       else {
-        std::cout<<(*i)->toString() + " hellboy temp trans is "<<iEndSchedule<<", rank = "<<(*i)->getPriority()<< ",Runable "<< aTempTrans->getRunnableTime()<< ",virtual "<< aTempTrans->getVirtualLength()<<std::endl;
+        std::cout<<(*i)->toString() + "temp trans is "<<aTempTrans->toShortString()<<std::endl;
         currentRank = (*i)->getPriority();
       }
 #ifdef DEBUG_FPGA
@@ -120,27 +132,32 @@ TMLTime ReconfigScheduler::schedule(TMLTime iEndSchedule){
 	  if (aTempTrans!=0 && aTempTrans->getVirtualLength()!=0){
 
 	    aRunnableTime=aTempTrans->getRunnableTime();
-	    std::cout << "-----------hellboy_FUTURE: Runable time: " << aRunnableTime << ", " << aTempTrans->getCommand()->getTask()->toString() << std::endl;
-        if ((*i)->getPriority()<aHighestPrioPast || ((*i)->getPriority()==aHighestPrioPast && aRunnableTime<aLowestRunnableTimePast)){
-            aHighestPrioPast=(*i)->getPriority();
-            aLowestRunnableTimePast=aRunnableTime;
-            aMarkerPast=aTempTrans;
-            aSourcePast=*i;
-        }
+
+	      //Past
+            if ((*i)->getPriority()<aHighestPrioPast || ((*i)->getPriority()==aHighestPrioPast && aRunnableTime<aLowestRunnableTimePast)){
+                aHighestPrioPast=(*i)->getPriority();
+                aLowestRunnableTimePast=aRunnableTime;
+                aMarkerPast=aTempTrans;
+                aSourcePast=*i;
+            }
+
 #ifdef DEBUG_FPGA
 	    std::cout<<"erase"<<std::endl;
 #endif
 	  }
 	}
-	if (aMarkerPast!=0){
+	if (aMarkerPast==0){
+	  _nextTransaction=(aSourceFuture==0)? 0 : aSourceFuture->getNextTransaction(iEndSchedule);;
+	  _lastSource=aSourceFuture; //NEW
+	}else{
 	  _nextTransaction=aSourcePast->getNextTransaction(iEndSchedule);;
 	  _lastSource=aSourcePast; //NEW
-	  _reconfigNumber = aSourcePast->getPriority();
 	}
 
 #ifdef DEBUG_FPGA
 	std::cout<<"end order scheduler"<<std::endl;
 #endif
+    _reconfigNumber = minRank;
 	return _reconfigNumber;
 }
 
-- 
GitLab