From 5ceb836097cd3fba592a50914afe77713f82d89c Mon Sep 17 00:00:00 2001
From: Le Van Truong <le.truong@telecom-paris.fr>
Date: Wed, 4 Mar 2020 13:13:58 +0100
Subject: [PATCH] #250 Emptying simulation transactions during simulation

---
 simulators/c++2/src_simulator/app/TMLTask.cpp |  6 ++++
 simulators/c++2/src_simulator/app/TMLTask.h   |  1 +
 simulators/c++2/src_simulator/arch/Bus.cpp    |  6 ++++
 simulators/c++2/src_simulator/arch/Bus.h      |  1 +
 simulators/c++2/src_simulator/arch/FPGA.cpp   |  6 ++++
 simulators/c++2/src_simulator/arch/FPGA.h     |  1 +
 .../c++2/src_simulator/arch/MultiCoreCPU.cpp  |  6 ++++
 .../c++2/src_simulator/arch/MultiCoreCPU.h    |  1 +
 .../src_simulator/arch/SchedulableDevice.h    |  1 +
 .../c++2/src_simulator/arch/SingleCoreCPU.cpp |  6 ++++
 .../c++2/src_simulator/arch/SingleCoreCPU.h   |  1 +
 .../c++2/src_simulator/sim/Simulator.cpp      | 30 +++++++++++++++++++
 simulators/c++2/src_simulator/sim/Simulator.h |  2 ++
 .../java/remotesimulation/CommandParser.java  |  8 +++++
 .../JPanelTaskTransactions.java               | 13 ++++++--
 15 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/simulators/c++2/src_simulator/app/TMLTask.cpp b/simulators/c++2/src_simulator/app/TMLTask.cpp
index 18444abdbe..3aed98b3d2 100755
--- a/simulators/c++2/src_simulator/app/TMLTask.cpp
+++ b/simulators/c++2/src_simulator/app/TMLTask.cpp
@@ -527,6 +527,12 @@ std::string TMLTask::determineHTMLCellClass( 	std::map<TMLTask*, std::string> &t
 	return taskColors[ task ];
 }
 
+void TMLTask::removeTrans(int numberOfTrans){
+    if (numberOfTrans == 1){
+        _transactList.clear();
+    }
+}
+
 void TMLTask::schedule2HTML(std::ofstream& myfile) const {    
   //	myfile << "<h2><span>Scheduling for device: "<< _name << "</span></h2>" << std::endl;
   myfile << SCHED_HTML_DIV << SCHED_HTML_BOARD;
diff --git a/simulators/c++2/src_simulator/app/TMLTask.h b/simulators/c++2/src_simulator/app/TMLTask.h
index ddfe1f25e5..51f103d52e 100755
--- a/simulators/c++2/src_simulator/app/TMLTask.h
+++ b/simulators/c++2/src_simulator/app/TMLTask.h
@@ -148,6 +148,7 @@ public:
       	\param iTrans Pointer to the transaction
     	*/ 
 	void addTransaction(TMLTransaction* iTrans);
+    void removeTrans(int numberOfTrans);
 	virtual std::ostream& writeObject(std::ostream& s);
 	virtual std::istream& readObject(std::istream& s);
 	virtual void streamBenchmarks(std::ostream& s) const;
diff --git a/simulators/c++2/src_simulator/arch/Bus.cpp b/simulators/c++2/src_simulator/arch/Bus.cpp
index 0f15dbbde1..1b850c0324 100644
--- a/simulators/c++2/src_simulator/arch/Bus.cpp
+++ b/simulators/c++2/src_simulator/arch/Bus.cpp
@@ -256,6 +256,12 @@ int Bus::allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) cons
   return total;
 }
 
+void Bus::removeTrans(int numberOfTrans){
+    if (numberOfTrans == 1){
+        _transactList.clear();
+    }
+}
+
 void Bus::latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2) {
 
   for(TransactionList::const_iterator i=_transactList.begin(); i != _transactList.end(); ++i){
diff --git a/simulators/c++2/src_simulator/arch/Bus.h b/simulators/c++2/src_simulator/arch/Bus.h
index 1ca6d08611..0fa7a47427 100644
--- a/simulators/c++2/src_simulator/arch/Bus.h
+++ b/simulators/c++2/src_simulator/arch/Bus.h
@@ -107,6 +107,7 @@ public:
     	*/
 	int allTrans2XML(std::ostringstream& glob, int maxNbOfTrans) const;
     int allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) const;
+    void removeTrans(int numberOfTrans);
 	void latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2);
 	/**
       	\param myfile Reference to the ofstream object representing the output file
diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp
index 70f8086e9c..2a6a2a8825 100644
--- a/simulators/c++2/src_simulator/arch/FPGA.cpp
+++ b/simulators/c++2/src_simulator/arch/FPGA.cpp
@@ -434,6 +434,12 @@ int FPGA::allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) con
   return total;
 }
 
+void FPGA::removeTrans(int numberOfTrans){
+    if (numberOfTrans == 1){
+        _transactList.clear();
+    }
+}
+
 void FPGA::latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2) {
   for(TransactionList::const_iterator i=_transactList.begin(); i != _transactList.end(); ++i){
     if ((*i)->getCommand() !=NULL){
diff --git a/simulators/c++2/src_simulator/arch/FPGA.h b/simulators/c++2/src_simulator/arch/FPGA.h
index bcd7802c6e..1a6796b71b 100644
--- a/simulators/c++2/src_simulator/arch/FPGA.h
+++ b/simulators/c++2/src_simulator/arch/FPGA.h
@@ -133,6 +133,7 @@ public:
 	///inline unsigned int getTransNumber() { return _transNumber;}
         inline unsigned int getID () { return _ID;}
 	void HW2HTML(std::ofstream& myfile) ;
+    void removeTrans(int numberOfTrans);
 	void schedule2HTML(std::ofstream& myfile) ;
 	inline const TaskList& getTaskList() const{return _taskList;}
 	inline void setHtmlCurrTask(TMLTask *t) { _htmlCurrTask=t;}
diff --git a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
index 8f85e7b42a..3ff2398cbe 100644
--- a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
@@ -615,6 +615,12 @@ int MultiCoreCPU::allTrans2XMLByTask(std::ostringstream& glob, std::string taskN
   return total;
 }
 
+void MultiCoreCPU::removeTrans(int numberOfTrans){
+    if (numberOfTrans == 1){
+        _transactList.clear();
+    }
+}
+
 
 void MultiCoreCPU::latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2) {
 
diff --git a/simulators/c++2/src_simulator/arch/MultiCoreCPU.h b/simulators/c++2/src_simulator/arch/MultiCoreCPU.h
index 12e29f4043..32660f3656 100644
--- a/simulators/c++2/src_simulator/arch/MultiCoreCPU.h
+++ b/simulators/c++2/src_simulator/arch/MultiCoreCPU.h
@@ -117,6 +117,7 @@ public:
     	*/
 	int allTrans2XML(std::ostringstream& glob, int maxNbOfTrans) const;
     int allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) const;
+    void removeTrans(int numberOfTrans);
 	void latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2);
 	virtual void streamBenchmarks(std::ostream& s) const;
 	virtual void reset();
diff --git a/simulators/c++2/src_simulator/arch/SchedulableDevice.h b/simulators/c++2/src_simulator/arch/SchedulableDevice.h
index 68e3181e8c..ca1742df39 100644
--- a/simulators/c++2/src_simulator/arch/SchedulableDevice.h
+++ b/simulators/c++2/src_simulator/arch/SchedulableDevice.h
@@ -98,6 +98,7 @@ public:
 	virtual int allTrans2XML(std::ostringstream& glob, int maxNbOfTrans) const =0;
     virtual int allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) const =0;
 	virtual void latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2)=0;
+	virtual void removeTrans(int numberOfTrans)=0;
 	virtual std::string toString() const =0;
 	virtual std::istream& readObject(std::istream &is);
 	virtual std::ostream& writeObject(std::ostream &os);
diff --git a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
index 31297a19d3..aef0c43a1a 100644
--- a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
@@ -480,6 +480,12 @@ int SingleCoreCPU::allTrans2XMLByTask(std::ostringstream& glob, std::string task
   return total;
 }
 
+void SingleCoreCPU::removeTrans(int numberOfTrans){
+    if (numberOfTrans == 1){
+        _transactList.clear();
+    }
+}
+
 void SingleCoreCPU::latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2) {
   for(TransactionList::const_iterator i=_transactList.begin(); i != _transactList.end(); ++i){
     if ((*i)->getCommand() !=NULL){
diff --git a/simulators/c++2/src_simulator/arch/SingleCoreCPU.h b/simulators/c++2/src_simulator/arch/SingleCoreCPU.h
index 2ca77399c6..f2d60c45da 100644
--- a/simulators/c++2/src_simulator/arch/SingleCoreCPU.h
+++ b/simulators/c++2/src_simulator/arch/SingleCoreCPU.h
@@ -119,6 +119,7 @@ public:
     	*/
 	int allTrans2XML(std::ostringstream& glob, int maxNbOfTrans) const;
     int allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) const;
+    void removeTrans(int numberOfTrans);
 
 	void latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int id2);
 	void schedule2XML(std::ostringstream& glob,std::ofstream& myfile) const;
diff --git a/simulators/c++2/src_simulator/sim/Simulator.cpp b/simulators/c++2/src_simulator/sim/Simulator.cpp
index 72bf121a3a..e30fd221e9 100644
--- a/simulators/c++2/src_simulator/sim/Simulator.cpp
+++ b/simulators/c++2/src_simulator/sim/Simulator.cpp
@@ -428,6 +428,30 @@ int Simulator::allTrans2XMLByTask(std::ostringstream& glob, std::string taskName
   return total;
 }
 
+void Simulator::removeOldTransaction(int numberOfTrans){
+    for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i){
+        for(TaskList::const_iterator j = (*i)->getTaskList().begin(); j != (*i)->getTaskList().end(); ++j){
+            (*j)->removeTrans(numberOfTrans);
+        }
+    }
+    for(FPGAList::const_iterator i=_simComp->getFPGAList().begin(); i != _simComp->getFPGAList().end(); ++i){
+        for(TaskList::const_iterator j = (*i)->getTaskList().begin(); j != (*i)->getTaskList().end(); ++j){
+            (*j)->removeTrans(numberOfTrans);
+        }
+    }
+    for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i){
+      (*i)->removeTrans(numberOfTrans);
+    }
+
+    for(BusList::const_iterator j=_simComp->getBusList().begin(); j != _simComp->getBusList().end(); ++j){
+      (*j)->removeTrans(numberOfTrans);
+    }
+
+    for(FPGAList::const_iterator k=_simComp->getFPGAList().begin(); k != _simComp->getFPGAList().end(); ++k){
+        (*k)->removeTrans(numberOfTrans);
+    }
+}
+
 void Simulator::latencies2XML(std::ostringstream& glob, int id1, int id2) {
   for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i){
     (*i)->latencies2XML(glob, id1, id2);
@@ -2039,6 +2063,12 @@ void Simulator::decodeCommand(std::string iCmd, std::ostream& iXmlOutStream){
     anEntityMsg << TAG_TRANSACTION_NBo << "nb=\"" << returnedNbOfTransactions << "\"" << TAG_TRANSACTION_NBc <<  std::endl;
     std::cout << "End list of all transactions belong to a task." << std::endl;
     break;
+  case 26: //Emptying simulation transactions during simulation
+    aInpStream >> aParam2;
+    std::cout << "Remove list of " << aParam2 << " transactions per CPU or Bus." << std::endl;
+    removeOldTransaction(aParam2);
+    std::cout << "End remove list of transactions." << std::endl;
+    break;
   default:
     anEntityMsg << TAG_MSGo << MSG_CMDNFOUND<< TAG_MSGc << std::endl;
     anErrorCode=3;
diff --git a/simulators/c++2/src_simulator/sim/Simulator.h b/simulators/c++2/src_simulator/sim/Simulator.h
index 14407b323f..edcb776f20 100644
--- a/simulators/c++2/src_simulator/sim/Simulator.h
+++ b/simulators/c++2/src_simulator/sim/Simulator.h
@@ -275,6 +275,8 @@ public:
 
     int allTrans2XMLByTask(std::ostringstream& glob, std::string taskName) const;
 
+    void removeOldTransaction(int numberOfTrans);
+
 	void latencies2XML(std::ostringstream& glob, int id1, int id2);
 	
 	///Is true if the simulator is busy
diff --git a/src/main/java/remotesimulation/CommandParser.java b/src/main/java/remotesimulation/CommandParser.java
index 72ff0cd863..21650baceb 100755
--- a/src/main/java/remotesimulation/CommandParser.java
+++ b/src/main/java/remotesimulation/CommandParser.java
@@ -328,6 +328,14 @@ public class CommandParser {
         sc = new SimulationCommand("list-all-transactions-of-a-task", "lat", "25", params, paramNames, "Get all transactions of Task");
         commandList.add(sc);
 
+        // Remove all the transactions in the past
+        params = new int[1];
+        paramNames = new String[1];
+        params[0] = 1;
+        paramNames[0] = "<YES>: 1, <NO>: 0";
+        sc = new SimulationCommand("remove-all-trans", "rmat", "26", params, paramNames, "Remove all the transactions in the past");
+        commandList.add(sc);
+
         // rm-breakpoint
         params = new int[2];
         paramNames = new String[2];
diff --git a/src/main/java/ui/interactivesimulation/JPanelTaskTransactions.java b/src/main/java/ui/interactivesimulation/JPanelTaskTransactions.java
index 9127cb4432..8a64791598 100644
--- a/src/main/java/ui/interactivesimulation/JPanelTaskTransactions.java
+++ b/src/main/java/ui/interactivesimulation/JPanelTaskTransactions.java
@@ -15,7 +15,7 @@ import java.util.Vector;
 public class JPanelTaskTransactions extends JPanel {
     private JFrameInteractiveSimulation jfis;
     private TaskTransactionTableModel ttm;
-    private JButton updateTransactionInformationButton;
+    private JButton updateTransactionInformationButton, clearAllOldTransactions;
     private JScrollPane jspTransactionInfo;
     private JComboBox<String> tasks;
     private Vector<SimulationTransaction> _trans;
@@ -85,7 +85,7 @@ public class JPanelTaskTransactions extends JPanel {
         nbOfTransactions = new JTextField(Integer.toString(defaultNbOfTransactions), defaultNbOfTransactions);
         add(nbOfTransactions, c2);
 
-        add(new JLabel("# Task Name: "), c2);
+        add(new JLabel("Task Name: "), c2);
         tasks = new JComboBox<>();
         tasks.addItem("-----");
         if(tmlm != null){
@@ -98,6 +98,15 @@ public class JPanelTaskTransactions extends JPanel {
         add(tasks, c2);
         updateTransactionInformationButton = new JButton(jfis.actions[InteractiveSimulationActions.ACT_UPDATE_TRANSACTIONS]);
         add(updateTransactionInformationButton, c2);
+        clearAllOldTransactions = new JButton();
+        clearAllOldTransactions.setText("Clear all old transactions");
+        clearAllOldTransactions.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                jfis.sendCommand("rmat 1");
+            }
+        });
+        add(clearAllOldTransactions, c2);
         tasks.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent actionEvent) {
-- 
GitLab