From 062085b488b0c9580ebfc7163a14b71e4da42a7f Mon Sep 17 00:00:00 2001
From: niusiyuan <siyuan.niu@telecom-paristech.fr>
Date: Thu, 2 May 2019 16:22:35 +0200
Subject: [PATCH] 2tasks 2fpgas communication ok

---
 simulators/c++2/src_simulator/arch/FPGA.cpp   | 48 +++++++++++--------
 simulators/c++2/src_simulator/arch/FPGA.h     |  4 ++
 .../c++2/src_simulator/sim/Simulator.cpp      |  6 +++
 3 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp
index 976c523203..edaa12d60e 100644
--- a/simulators/c++2/src_simulator/arch/FPGA.cpp
+++ b/simulators/c++2/src_simulator/arch/FPGA.cpp
@@ -60,6 +60,7 @@ FPGA::FPGA(    ID iID,
 					      ,_cyclesBeforeIdle(iCyclesBeforeIdle)
 					      ,_cyclesPerExeci(iCyclesPerExeci)
 					      ,_cyclesPerExecc(iCyclesPerExecc)
+						// ,_fpgaNumber(0)
 					     
 {}
 
@@ -80,26 +81,32 @@ void FPGA::streamBenchmarks(std::ostream& s) const{
 
 TMLTransaction* FPGA::getNextTransaction(){
   std::cout<<"fpga getNextTransaction";
-#ifdef BUS_ENABLE
-  if(_masterNextTransaction==0 || _nextTransaction==0){
+  #ifdef BUS_ENABLED
+  if (_masterNextTransaction==0 || _nextTransaction==0){
+    if(_masterNextTransaction == 0) std::cout<<"master is 0"<<std::endl;
+    if(_nextTransaction==0) std::cout<<"nexttrans is 0"<<std::endl;
     return _nextTransaction;
-   }
-  else{
+  }else{
+#ifdef DEBUG_CPU
+    std::cout << "CPU:getNT: " << _name << " has bus transaction on master " << _masterNextTransaction->toString() << std::endl;
+#endif
+    //std::cout << "CRASH Trans:" << _nextTransaction->toString() << std::endl << "Channel: " << _nextTransaction->getChannel() << "\n";
     BusMaster* aTempMaster = getMasterForBus(_nextTransaction->getChannel()->getFirstMaster(_nextTransaction));
+    std::cout << "1  aTempMaster: " << aTempMaster << std::endl;
     bool aResult = aTempMaster->accessGranted();
- 
+    std::cout << "2" << std::endl;
     while (aResult && aTempMaster!=_masterNextTransaction){
-      
+      std::cout << "3" << std::endl;
       aTempMaster =_nextTransaction->getChannel()->getNextMaster(_nextTransaction);
-      
+      std::cout << "4" << std::endl;
       aResult = aTempMaster->accessGranted();
- 
+      std::cout << "5" << std::endl;
     }
     return (aResult)?_nextTransaction:0;
   }
 #else
-  if(_nextTransaction)std::cout<<_nextTransaction->toString()<<std::endl;
-  else std::cout<<"nexttrans is 0"<<std::endl;
+   if(_nextTransaction)std::cout<<_nextTransaction->toString()<<std::endl;
+
   return _nextTransaction;
 #endif
  }
@@ -208,7 +215,6 @@ std::cout<<"fpga addTransaction"<<std::endl;
       std::cout << "2\n";
       Slave* aTempSlave= _nextTransaction->getChannel()->getNextSlave(_nextTransaction);
       std::cout << "3\n";
-      aTempMaster->addBusContention(_nextTransaction->getStartTime()-max(_endSchedule,_nextTransaction->getRunnableTime()));
       while (aTempMaster!=0){
         std::cout << "3a\n";
         aTempMaster->addTransaction(_nextTransaction);
@@ -272,24 +278,28 @@ void FPGA::schedule(){
     std::cout<<(*it)->toShortString()<<std::endl;
   }
   TMLTransaction* aOldTransaction = _nextTransaction;
-  std::cout<<"111"<<std::endl;
-  static TaskList::iterator iter_task=_taskList.begin();
-   std::cout<<"222"<<std::endl;
+  //std::cout<<"111"<<std::endl;
+  TaskList::iterator iter_task=_taskList.begin();
+  //int time=0;
+  //  std::cout<<"222"<<std::endl;
    if(iter_task!=_taskList.end()){
-     std::cout<<"555"<<std::endl;
-    _nextTransaction=(*iter_task++)->getNextTransaction(0);
-    std::cout<<"666"<<std::endl;
+     //  std::cout<<"555"<<std::endl;
+    _nextTransaction=(*iter_task)->getNextTransaction(0);
+    if(_nextTransaction!=0 && _nextTransaction->getVirtualLength()==0)
+      _nextTransaction=0;
+    // std::cout<<"666"<<std::endl;
    }
    
-   std::cout<<"333"<<std::endl;
+   // std::cout<<"333"<<std::endl;
   //std::cout<<_nextTransaction->toShortString()<<std::endl;
+
   if (aOldTransaction!=0 && aOldTransaction!=_nextTransaction){ //NEW 
     if (_masterNextTransaction!=0) {
       _masterNextTransaction->registerTransaction(0);
 
     }
   }
-   std::cout<<"444"<<std::endl;
+  //std::cout<<"444"<<std::endl;
   if (_nextTransaction!=0 && aOldTransaction != _nextTransaction) calcStartTimeLength();
   std::cout << "fpga:schedule END " << _name << "+++++++++++++++++++++++++++++++++\n";
 }
diff --git a/simulators/c++2/src_simulator/arch/FPGA.h b/simulators/c++2/src_simulator/arch/FPGA.h
index f4590f088b..ab64448fd8 100644
--- a/simulators/c++2/src_simulator/arch/FPGA.h
+++ b/simulators/c++2/src_simulator/arch/FPGA.h
@@ -125,6 +125,8 @@ public:
 	virtual void registerTask(TMLTask* iTask){
 		_taskList.push_back(iTask);
 	}
+	inline void setFPGANumber(unsigned int num) { _fpgaNumber=num;}
+	inline unsigned int getFPGANumber() { return _fpgaNumber;}
 protected:
 	///List of all tasks running on the FPGA
 	TaskList _taskList;
@@ -141,6 +143,8 @@ protected:
 
 	TMLTime _reconfigTime;
 
+	unsigned int _fpgaNumber;
+
 	///Determines the correct bus master of this CPU connected to the same bus as bus master iDummy
 	/**
 	\param iDummy Dummy Bus Master
diff --git a/simulators/c++2/src_simulator/sim/Simulator.cpp b/simulators/c++2/src_simulator/sim/Simulator.cpp
index 496df3ee28..db9fe534b4 100644
--- a/simulators/c++2/src_simulator/sim/Simulator.cpp
+++ b/simulators/c++2/src_simulator/sim/Simulator.cpp
@@ -589,6 +589,12 @@ bool Simulator::simulate(TMLTransaction*& oLastTrans){
   std::cout<<"simulate"<<std::endl;
   //for_each(_simComp->getCPUList().begin(), _simComp->getCPUList().end(),std::mem_fun(&CPU::schedule));
    for_each(_simComp->getFPGAList().begin(), _simComp->getFPGAList().end(),std::mem_fun(&FPGA::schedule));
+   
+   /* for(FPGAList::iterator i=_simComp->getFPGAList().begin();i!=_simComp->getFPGAList().end();i++){
+     int j=0
+     (*i)->schedule();
+     (*i)->setFPGANumber(j++);
+     }*/
   //std::cout << "after schedule" << std::endl;
   //transLET=getTransLowestEndTime(cpuLET);
    std::cout<<"simulator get next transaction begin"<<std::endl;
-- 
GitLab