diff --git a/simulators/c++2/src_simulator/arch/CPU.cpp b/simulators/c++2/src_simulator/arch/CPU.cpp index 8edf5ffe4a5fa58fcbe866083cf25c92d9e86396..d40f6221558777f0ffbfac457b6f9a2117fc3ede 100644 --- a/simulators/c++2/src_simulator/arch/CPU.cpp +++ b/simulators/c++2/src_simulator/arch/CPU.cpp @@ -168,7 +168,7 @@ void CPU::schedule2XML(std::ostringstream& glob,std::ofstream& myfile) const{ } } -std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) const { +std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) { TransactionList _transactListClone; std::string taskList = iTracetaskList.c_str(); for (int z = 0; z < _transactList.size(); z++) { @@ -181,7 +181,7 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, if ( _transactListClone.size() == 0 ) { std::cout << "Device never activated" << std::endl; } else { - myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(this->_cycleTime) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "_core_" << this->_cycleTime << "</td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>" << std::endl;//myfile << "<table>" << std::endl << "<tr>"; + myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(this->_cycleTime) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "_core_" << this->_cycleTime << "</td><td class=\"notfirst\"></td><td class=\"notlast\"></td>";//myfile << "<table>" << std::endl << "<tr>"; // std::map<TMLTask*, std::string> taskCellClasses; // unsigned int nextCellClassIndex = 0; TMLTime aCurrTime = 0; @@ -223,10 +223,10 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, listScaleTime.push_back(aCurrTrans->getStartTime()+1); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; // writeHTMLColumn( myfile, aBlanks+1, "not", "idle time", "<- idle " + tempString.str() + " ->", false ); } else { - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aBlanks+1, "not", "idle time" ); } } @@ -237,10 +237,10 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, listScaleTime.push_back(aCurrTrans->getStartTime()); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; // writeHTMLColumn( myfile, aBlanks, "not", "idle time", "<- idle " + tempString.str() + " ->", false ); } else { - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aBlanks, "not", "idle time" ); } } @@ -255,7 +255,7 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, listScale.push_back(aLength); std::ostringstream title; title << "idle:" << aCurrTrans->getIdlePenalty() << " switching penalty:" << aCurrTrans->getTaskSwitchingPenalty(); - myfile << "<td colspan=\"" << aLength << "\" title=\"" << title.str() << "\" class=\"not\"></td>\n"; + myfile << "<td colspan=\"" << aLength << "\" title=\"" << title.str() << "\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aLength, "not", title.str() ); } aLength = aCurrTrans->getOperationLength(); @@ -271,7 +271,7 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, tempReduce += aLength - 10; aLength = 10; } - myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>\n"; + myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>"; // writeHTMLColumn( myfile, aLength, cellClass, aCurrTrans->toShortString(), aCurrContent ); listScale.push_back(aLength); if(aCurrTrans->getStartTime() > listScaleTime.back()){ @@ -288,8 +288,8 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, } } - myfile << "</tr>" << std::endl << "<tr>"; - myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>\n"; + myfile << "</tr>" << "<tr>"; + myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; for ( unsigned int aLength = 0; aLength < listScale.size(); aLength += 1 ) { std::ostringstream spanVal; if(aLength < listScaleTime.size()) @@ -313,15 +313,18 @@ std::map<TMLTask*, std::string> CPU::HWTIMELINE2HTML(std::ostringstream& myfile, } //myfile << "<td colspan=\"5\" class=\"sc\">" << aLength << "</td>"; } - myfile << "</tr>" << std::endl << "<tr>"; - for ( unsigned int aLength = 0; aLength < aCurrTime - tempReduce + 2; aLength++ ) { + myfile << "</tr>" << "<tr>"; + for ( unsigned int aLength = 0; aLength < 3; aLength++ ) { if( aLength == 1) { myfile << "<th class=\"notfirst\">"; } else { myfile << "<th></th>"; } } - myfile << "</tr>" << std::endl << std::endl; + if (aCurrTime - tempReduce + 2 > maxScale) { + maxScale = aCurrTime - tempReduce + 2; + } + myfile << "</tr>"; myfile << SCHED_HTML_JS_CLEAR << std::endl; } return taskCellClasses; diff --git a/simulators/c++2/src_simulator/arch/CPU.h b/simulators/c++2/src_simulator/arch/CPU.h index 3ce2797cf8bf0162ed5cda1424cb276c83940353..83b73216e0cfd45838b9e0790228b98d1c5e9cdc 100755 --- a/simulators/c++2/src_simulator/arch/CPU.h +++ b/simulators/c++2/src_simulator/arch/CPU.h @@ -121,7 +121,8 @@ public: void buttonPieChart(std::ofstream& myfile) const; void showPieChart(std::ofstream& myfile) const; void HW2HTML(std::ofstream& myfile) const; - std::map<TMLTask*, std::string> HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) const; + std::map<TMLTask*, std::string> HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList); + inline unsigned int getMaxScale() { return maxScale; } void schedule2HTML(std::ofstream& myfile) const; void schedule2XML(std::ostringstream& glob,std::ofstream& myfile) const; inline void setCoreNumberGraph(unsigned int n){ _coreNumberGraph=n;} @@ -136,6 +137,7 @@ protected: ///Amount of cores unsigned int amountOfCore; unsigned int _coreNumberGraph; + unsigned int maxScale; ///Dirty flag of the current scheduling decision //bool _schedulingNeeded; diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp index f2dc162ca5037bd24fbd3834f50c8bd233ef5729..1b175d9d2800430fa9e3dd1ee86fb9a96d7a5fc4 100644 --- a/simulators/c++2/src_simulator/arch/FPGA.cpp +++ b/simulators/c++2/src_simulator/arch/FPGA.cpp @@ -607,9 +607,9 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile std::cout << "Device never activated" << std::endl; } else { if(_startFlagHTML == true){ - myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(_htmlCurrTask) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "</td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>" << std::endl; + myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(_htmlCurrTask) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "</td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; } else { - myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(_htmlCurrTask) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>\n"<< std::endl; + myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad(_htmlCurrTask) << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; } TMLTime aCurrTime = 0; unsigned int taskOccurTime = 0; @@ -651,9 +651,9 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile listScaleTime.push_back(aCurrTrans->getStartTime()+1); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; } else { - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>"; } } else if ( aBlanks > 0 ){ @@ -663,9 +663,9 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile listScaleTime.push_back(aCurrTrans->getStartTime()); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; } else { - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>"; } } @@ -679,7 +679,7 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile tempReduce += aLength - 10; aLength = 10; } - myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>\n"; + myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>"; // writeHTMLColumn( myfile, aLength, cellClass, aCurrTrans->toShortString(), aCurrContent ); listScale.push_back(aLength); if(aCurrTrans->getStartTime() > listScaleTime.back()){ @@ -696,8 +696,8 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile } } if(listScale.size() > 1) { - myfile << "</tr>" << std::endl << "<tr>"; - myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>\n"; + myfile << "</tr>" << "<tr>"; + myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; for ( unsigned int aLength = 0; aLength < listScale.size(); aLength += 1 ) { std::ostringstream spanVal; @@ -722,16 +722,19 @@ std::map<TMLTask*, std::string> FPGA::HWTIMELINE2HTML(std::ostringstream& myfile // writeHTMLColumn( myfile, listScale[aLength+1], "sc", spanVal.str(), spanVal.str(), false ); } } - myfile << "</tr>" << std::endl << "<tr>"; + myfile << "</tr>" << "<tr>"; - for ( unsigned int aLength = 0; aLength < aCurrTime - tempReduce + 2; aLength++ ) { + for ( unsigned int aLength = 0; aLength < 3; aLength++ ) { if( aLength == 1) { myfile << "<th class=\"notfirst\">"; } else { myfile << "<th></th>"; } } - myfile << "</tr>" << std::endl << std::endl; + if (aCurrTime - tempReduce + 2 > maxScale) { + maxScale = aCurrTime - tempReduce + 2; + } + myfile << "</tr>"; myfile << SCHED_HTML_JS_CLEAR << std::endl; } diff --git a/simulators/c++2/src_simulator/arch/FPGA.h b/simulators/c++2/src_simulator/arch/FPGA.h index a060e20830b4b615da7821217ba1077a64116dfa..602f84305d2827a5f8a891f59a8a53699a64fb17 100644 --- a/simulators/c++2/src_simulator/arch/FPGA.h +++ b/simulators/c++2/src_simulator/arch/FPGA.h @@ -134,6 +134,7 @@ public: inline unsigned int getID () { return _ID;} void HW2HTML(std::ofstream& myfile) ; std::map<TMLTask*, std::string> HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses1,unsigned int nextCellClassIndex1, std::string& iTracetaskList); + inline unsigned int getMaxScale() { return maxScale; } void removeTrans(int numberOfTrans); void schedule2HTML(std::ofstream& myfile) ; inline const TaskList& getTaskList() const{return _taskList;} @@ -196,6 +197,7 @@ protected: bool _startFlagHTML; bool _endFlagHTML; unsigned int _reconfigNumber; + unsigned int maxScale; TMLTime _maxEndTime; unsigned int nextCellClassIndex; std::map<TMLTask*, std::string> taskCellClasses; diff --git a/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp b/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp index b24757b3ad260ebb3828623400eb3d9ba5da2eef..6dacfacb7a9191badb47a8d62e5b1ae53c3a43ff 100644 --- a/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp +++ b/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp @@ -298,7 +298,7 @@ void SchedulableDevice::buttonPieChart(std::ofstream& myfile) const{ myfile << " chart" << _ID << ".update();" << std::endl; } -std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) const { +std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) { TransactionList _transactListClone; std::string taskList = iTracetaskList.c_str(); for (int z = 0; z < _transactList.size(); z++) { @@ -311,7 +311,7 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings if ( _transactListClone.size() == 0 ) { std::cout << "Device never activated" << std::endl; } else { - myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad() << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "</td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>" << std::endl; + myfile << "<tr><td title = \"Average load: " << std::setprecision(2) << averageLoad() << "; Utilization: " << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << "\" width=\"170px\" style=\"max-width: unset;min-width: 170px;background-color: aqua;\">" << _name << "</td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; // std::map<TMLTask*, std::string> taskCellClasses; // unsigned int nextCellClassIndex = 0; TMLTime aCurrTime = 0; @@ -347,10 +347,10 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings listScaleTime.push_back(aCurrTrans->getStartTime()+1); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; // writeHTMLColumn( myfile, aBlanks+1, "not", "idle time", "<- idle " + tempString.str() + " ->", false ); } else { - myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks+1 <<"\" title=\"idle time\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aBlanks+1, "not", "idle time" ); } } @@ -361,10 +361,10 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings listScaleTime.push_back(aCurrTrans->getStartTime()); } if (isBlankTooBig){ - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\">" << "<- idle " + tempString.str() + " ->" << "</td>"; // writeHTMLColumn( myfile, aBlanks, "not", "idle time", "<- idle " + tempString.str() + " ->", false ); } else { - myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>\n"; + myfile << "<td colspan=\""<< aBlanks <<"\" title=\"idle time\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aBlanks, "not", "idle time" ); } } @@ -380,7 +380,7 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings } listScale.push_back(aLength); title << "idle:" << aCurrTrans->getIdlePenalty() << " switching penalty:" << aCurrTrans->getTaskSwitchingPenalty(); - myfile << "<td colspan=\"" << aLength << "\" title=\"" << title.str() << "\" class=\"not\"></td>\n"; + myfile << "<td colspan=\"" << aLength << "\" title=\"" << title.str() << "\" class=\"not\"></td>"; // writeHTMLColumn( myfile, aLength, "not", title.str() ); } @@ -397,7 +397,7 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings tempReduce += aLength - 10; aLength = 10; } - myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>\n"; + myfile << "<td colspan=\"" << aLength << "\" title=\"" << aCurrTrans->toShortString() << "\" class=\""<< cellClass <<"\">"<< aCurrContent <<"</td>"; // writeHTMLColumn( myfile, aLength, cellClass, aCurrTrans->toShortString(), aCurrContent); listScale.push_back(aLength); if(aCurrTrans->getStartTime() > listScaleTime.back()){ @@ -411,8 +411,8 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings // } } - myfile << "</tr>" << std::endl << "<tr>"; - myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n<td class=\"notfirst\"></td>\n<td class=\"notlast\"></td>\n"; + myfile << "</tr>" << "<tr>"; + myfile << "<td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notfirst\"></td><td class=\"notlast\"></td>"; for ( unsigned int aLength = 0; aLength < listScale.size(); aLength += 1 ) { std::ostringstream spanVal; @@ -437,15 +437,18 @@ std::map<TMLTask*, std::string> SchedulableDevice::HWTIMELINE2HTML(std::ostrings // writeHTMLColumn( myfile, listScale[aLength+1], "sc", spanVal.str(), spanVal.str(), false ); } } - myfile << "</tr>" << std::endl << "<tr>"; - for ( unsigned int aLength = 0; aLength < aCurrTime - tempReduce + 2; aLength++ ) { + myfile << "</tr>" << "<tr>"; + for ( unsigned int aLength = 0; aLength < 3; aLength++ ) { if( aLength == 1) { myfile << "<th class=\"notfirst\">"; } else { myfile << "<th></th>"; } } - myfile << "</tr>" << std::endl; + if (aCurrTime - tempReduce + 2 > maxScale) { + maxScale = aCurrTime - tempReduce + 2; + } + myfile << "</tr>"; myfile << SCHED_HTML_JS_CLEAR << std::endl; } return taskCellClasses; diff --git a/simulators/c++2/src_simulator/arch/SchedulableDevice.h b/simulators/c++2/src_simulator/arch/SchedulableDevice.h index 0f8979b0c022764d7ad91762f02afa97e3da1ccf..c09758a1e01daac262185dc0baf6632dba6003dd 100644 --- a/simulators/c++2/src_simulator/arch/SchedulableDevice.h +++ b/simulators/c++2/src_simulator/arch/SchedulableDevice.h @@ -79,7 +79,8 @@ public: void drawPieChart(std::ofstream& myfile) const; void showPieChart(std::ofstream& myfile) const; void HW2HTML(std::ofstream& myfile) const; - std::map<TMLTask*, std::string> HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList) const; + std::map<TMLTask*, std::string> HWTIMELINE2HTML(std::ostringstream& myfile,std::map<TMLTask*, std::string> taskCellClasses,unsigned int nextCellClassIndex, std::string& iTracetaskList); + inline unsigned int getMaxScale() { return maxScale; } ///Writes a HTML representation of the schedule to an output file /** \param myfile Reference to the ofstream object representing the output file @@ -183,6 +184,7 @@ protected: bool _deleteScheduler; ///Busy cycles since simulation start TMLTime _busyCycles; + unsigned int maxScale; unsigned int _static_consumPerCycle; unsigned int _dynamic_consumPerCycle; static TMLTime _overallTransNo; diff --git a/simulators/c++2/src_simulator/definitions.h b/simulators/c++2/src_simulator/definitions.h index 27e3d43760adc454e4dddb8a463d7c6fe0bcf049..db56053b3fa2e5567856b07b60eac988d3efb35f 100644 --- a/simulators/c++2/src_simulator/definitions.h +++ b/simulators/c++2/src_simulator/definitions.h @@ -287,6 +287,7 @@ using std::max; #define SCHED_HTML_JS_CLEAR "<div class = \"clear\"></div>" #define NB_HTML_COLORS 15 #define SHOW_PIE_CHART "ShowPie" +#define BUFFER_SIZE 2000 //maximum length of a command sent to server #define SCHED_HTML_JS_FUNCTION "= function() {\n \ var r = Math.floor(Math.random() * 255);\n \ @@ -323,87 +324,7 @@ using std::max; ds.hidden=!ds.hidden;\n \ });\n" -#define SCHED_HTML_CSS_CONTENT_TIMELINE "table{\n \ - border-collapse: collapse;\n \ - empty-cells: show;\n \ - margin: 0.4cm;\n \ -}\n \ -td{\n \ - padding: 10px 5px;\n \ - border: 1px solid black;\n \ - max-width: 5px;\n \ -}\n \ -th{\n \ - padding: 5px;\n \ -}\n \ -.sc{\n \ - border-style: none;\n \ - padding: 0px;\n \ - font-size: small;\n \ - transform: rotate(45deg);\n \ - transform-origin: left top;\n \ -}\n \ -.sc1{\n \ - border-style: none;\n \ - padding: 0px;\n \ - font-size: small;\n \ - color: red;\n \ - transform: rotate(45deg);\n \ - transform-origin: left top;\n \ -}\n \ -h2 {\n \ - border-bottom: 1px solid #666;\n \ -}\n \ -h2 span {\n \ - position: relative;\n \ - left: -0.3em;\n \ - bottom: -0.6em;\n \ - padding: 1px 0.5em;\n \ - border-style: solid;\n \ - border-width: 1px 1px 1px 0.8em;\n \ - border-color: #666 #666 #666 #008;\n \ - background-color: #ddd;\n \ -}\n \ -.space{border-style: none;}\n \ -.not{background-color: white; text-align: center}\n \ -.notfirst{\n \ - background-color: white;\n \ - border-width: 2px;\n \ - border-color: red;\n \ - border-style: none solid none none;\n \ -}\n \ -.notmid {\n \ - background-color: white;\n \ - text-align: right;\n \ - border-style: solid none none none;\n \ -}\n \ -.notlast {\n \ - background-color: white;\n \ - width: 5px;\n \ - border-style: none none none none;\n \ -}\n \ -.t0{background-color: yellow;}\n \ -.t1{background-color: purple;}\n \ -.t2{background-color: red;}\n \ -.t3{background-color: silver;}\n \ -.t4{background-color: teal;}\n \ -.t5{background-color: aqua;}\n \ -.t6{background-color: olive;}\n \ -.t7{background-color: navy;}\n \ -.t8{background-color: maroon;}\n \ -.t9{background-color: lime;}\n \ -.t10{background-color: green;}\n \ -.t11{background-color: gray;}\n \ -.t12{background-color: fuchsia;}\n \ -.t13{background-color: blue;}\n \ -.t14{background-color: darkred;}\n \ -.wrapper {\n \ - width: 256px;\n \ - height: 256px;\n \ -}\n \ -.clear {\n \ - clear:both\n \ -}" +#define SCHED_HTML_CSS_CONTENT_TIMELINE "table{border-collapse: collapse;empty-cells: show;margin: 0.4cm;}td{padding: 10px 5px;border: 1px solid black;max-width: 5px;}th{padding: 5px;}.sc{border-style: none;padding: 0px;font-size: small;transform: rotate(45deg);transform-origin: left top;}.sc1{border-style: none;padding: 0px;font-size: small;color: red;transform: rotate(45deg);transform-origin: left top;}h2{border-bottom: 1px solid #666;}h2 span {position: relative;left: -0.3em;bottom: -0.6em;padding: 1px 0.5em;border-style: solid;border-width: 1px 1px 1px 0.8em;border-color: #666 #666 #666 #008;background-color: #ddd; } .space{border-style: none;} .not{background-color: white; text-align: center} .notfirst{background-color: white;border-width: 2px;border-color: red;border-style: none solid none none; } .notmid {background-color: white;text-align: right;border-style: solid none none none; } .notlast {background-color: white;width: 5px;border-style: none none none none; } .t0{background-color: yellow;} .t1{background-color: purple;} .t2{background-color: red;} .t3{background-color: silver;} .t4{background-color: teal;} .t5{background-color: aqua;} .t6{background-color: olive;} .t7{background-color: navy;} .t8{background-color: maroon;} .t9{background-color: lime;} .t10{background-color: green;} .t11{background-color: gray;} .t12{background-color: fuchsia;} .t13{background-color: blue;} .t14{background-color: darkred;}.wrapper {width: 256px;height: 256px; } .clear {clear:both}" #define SCHED_HTML_CSS_CONTENT "table{\n \ border-collapse: collapse;\n \ diff --git a/simulators/c++2/src_simulator/sim/SimServSyncInfo.h b/simulators/c++2/src_simulator/sim/SimServSyncInfo.h index 987bdc394d090275fe7ad3d1c169727756b97586..91906087bc6ab8cc3e4db97e32666f817b390b44 100644 --- a/simulators/c++2/src_simulator/sim/SimServSyncInfo.h +++ b/simulators/c++2/src_simulator/sim/SimServSyncInfo.h @@ -43,7 +43,6 @@ Ludovic Apvrille, Renaud Pacalet #include <definitions.h> -#define BUFFER_SIZE 1000 class CurrentComponents; class Simulator; class ServerIF; diff --git a/simulators/c++2/src_simulator/sim/Simulator.cpp b/simulators/c++2/src_simulator/sim/Simulator.cpp index fe1b486a3ada108d2cb3eb6dba3fe61c8057693c..430b97b751cf678774d396c4042eca21aad12582 100644 --- a/simulators/c++2/src_simulator/sim/Simulator.cpp +++ b/simulators/c++2/src_simulator/sim/Simulator.cpp @@ -465,26 +465,30 @@ void Simulator::timeline2HTML(std::string& iTracetaskList, std::ostringstream& m std::map<TMLTask*, std::string> taskCellClasses; - myfile << "<!DOCTYPE html>\n"; // <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n - myfile << "<html>\n"; // <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n - myfile << SCHED_HTML_BEG_HEAD; // <head>\n - myfile << SCHED_HTML_BEG_STYLE; // <style>\n"; - myfile << SCHED_HTML_CSS_CONTENT_TIMELINE << std::endl; - myfile << SCHED_HTML_END_STYLE; // <style>\n"; - myfile << SCHED_HTML_BEG_TITLE; // <title> + myfile << "<!DOCTYPE html>"; // <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n + myfile << "<html>"; // <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n + myfile << "<head>"; // <head>\n + myfile << "<style>"; // <style>\n"; + myfile << SCHED_HTML_CSS_CONTENT_TIMELINE; + myfile << "</style>"; // <style>\n"; + myfile << "<title>"; // <title> myfile << "Timeline Diagram"; - myfile << SCHED_HTML_END_TITLE; // </title>\n - myfile << SCHED_HTML_END_HEAD; // </head>\n + myfile << "</title>"; // </title>\n + myfile << "</head>"; // </head>\n myfile << SCHED_HTML_BEG_BODY; // <body>\n // myfile << "<h1>Task to show: " << iTracetaskList.c_str() <<"</h1>\n"; - myfile << "<table style=\"float: left;position: relative;\"><tr><td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n" - << "<td class=\"notfirst\"></td>\n" - << "<td style=\"border-style: solid none none none; border-width: 2px;border-color: red;text-align:right\"colspan=\"500\"><b>Time</b></td>\n</tr>\n" - << "<tr><th></th><th class=\"notfirst\"></th></tr>\n" - << "<div class = \"clear\"></div>" << std::endl; + myfile << "<table style=\"float: left;position: relative;\"><tr><td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>" + << "<td class=\"notfirst\"></td>" + << "<td style=\"border-style: solid none none none; border-width: 2px;border-color: red;text-align:right\"colspan=\"500\"><b>Time</b></td></tr>" + << "<tr><th></th><th class=\"notfirst\"></th></tr>" + << "<div class = \"clear\"></div>"; + unsigned int maxScale = 0; for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i){ for(unsigned int j = 0; j < (*i)->getAmoutOfCore(); j++) { taskCellClasses = (*i)->HWTIMELINE2HTML(myfile, taskCellClasses, taskCellClasses.size(), iTracetaskList); + if((*i)->getMaxScale() > maxScale) { + maxScale = (*i)->getMaxScale(); + } (*i)->setCycleTime((*i)->getCycleTime()+1); } if((*i)->getAmoutOfCore() == 1) @@ -496,23 +500,61 @@ void Simulator::timeline2HTML(std::string& iTracetaskList, std::ostringstream& m for(TaskList::const_iterator i = (*j)->getTaskList().begin(); i != (*j)->getTaskList().end(); ++i){ (*j)->setHtmlCurrTask(*i); taskCellClasses = (*j)->HWTIMELINE2HTML(myfile, taskCellClasses, taskCellClasses.size(), iTracetaskList); + if((*j)->getMaxScale() > maxScale) { + maxScale = (*j)->getMaxScale(); + } (*j)->setStartFlagHTML(false); } } for(BusList::const_iterator j=_simComp->getBusList().begin(); j != _simComp->getBusList().end(); ++j){ taskCellClasses = (*j)->HWTIMELINE2HTML(myfile, taskCellClasses, taskCellClasses.size(), iTracetaskList); + if((*j)->getMaxScale() > maxScale) { + maxScale = (*j)->getMaxScale(); + } + } + + myfile << "</tr><tr><th></th><th class=\"notfirst\"></th></tr><div class = \"clear\"></div>"; + for ( unsigned int aLength = 0; aLength < maxScale; aLength++ ) { + if( aLength == 1) { + myfile << "<th class=\"notfirst\">"; + } else { + myfile << "<th></th>"; + } } - myfile << "</tr>\n<tr><th></th><th class=\"notfirst\"></th></tr>\n<div class = \"clear\"></div>\n"; - myfile << "</table>\n<table>\n<tr><td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td>\n<td class=\"notlast\"></td>\n<td class=\"notlast\"></td>\n"; + myfile << "</table><table><tr><td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notlast\"></td><td class=\"notlast\"></td>"; for( std::map<TMLTask*, std::string>::iterator taskColIt = taskCellClasses.begin(); taskColIt != taskCellClasses.end(); ++taskColIt ) { TMLTask* task = (*taskColIt).first; // Unset the default td max-width of 5px. For some reason setting the max-with on a specific t style does not work myfile << "<td class=\"" << taskCellClasses[ task ] << "\"></td><td style=\"max-width: unset;min-width: 170px;\">" << task->toString() << "</td><td class=\"space\"></td>"; } - myfile << "</tr>\n</table>\n"; - myfile << SCHED_HTML_END_BODY; // </body>\n - myfile << SCHED_HTML_END_HTML; // </html>\n + myfile << "</tr><tr><td width=\"170px\" style=\"max-width: unset;min-width: 170px;border-style: none none none none;\"></td><td class=\"notlast\"></td><td class=\"notlast\"></td>"; + for( std::map<TMLTask*, std::string>::iterator taskColIt = taskCellClasses.begin(); taskColIt != taskCellClasses.end(); ++taskColIt ) { + TMLTask* task = (*taskColIt).first; + std::string str = getTaskCellStatus(task->getState()); + std::size_t pos = str.find(":"); + if(pos != std::string::npos){ + std::string str1 = str.substr (0, pos); + std::string str2 = str.substr (pos + 1); + myfile << "<td style=\"border-style: none none none none;\"></td><td style=\"max-width: unset;min-width: 170px;border-style: none none none none;color:" << str2 << "\"><b>" << str1 << "</b></td><td class=\"space\"></td>"; + } + } + myfile << "</tr></table>"; + myfile << "</body>"; // </body>\n + myfile << "</html>"; // </html>\n +} +std::string Simulator::getTaskCellStatus(int i) const { + switch (i){ + case 2: + return "Running:green"; + case 1: + return "Runnable:blue"; + case 0: + return "Suspended:orange"; + case 3: + return "Terminated:red"; + } + return "Unknown:gray"; } void Simulator::schedule2HTML(std::string& iTraceFileName) const { #ifdef DEBUG_HTML @@ -1412,9 +1454,9 @@ void Simulator::decodeCommand(std::string iCmd, std::ostream& iXmlOutStream){ if (!_simComp->getNonDaemonTaskList().empty()) { for (TaskList::const_iterator i=_simComp->getNonDaemonTaskList().begin(); i != _simComp->getNonDaemonTaskList().end(); ++i) { //the simulation terminated when all tasks are terminated or suspended - if((*i)->getState()==3 || (*i)->getState()==0){ + if((*i)->getState() == 3 || (*i)->getState() == 0){ tempDaemon ++; - if ((*i)->getState()==3) { + if ((*i)->getState() == 3) { checkTerminated = true; } } diff --git a/simulators/c++2/src_simulator/sim/Simulator.h b/simulators/c++2/src_simulator/sim/Simulator.h index ad74c1c55c41b60184a5bbee4714f189ed784cbe..0fb6eceb3bc46bc115aa63cfdcf1c4257589b3ea 100644 --- a/simulators/c++2/src_simulator/sim/Simulator.h +++ b/simulators/c++2/src_simulator/sim/Simulator.h @@ -248,6 +248,7 @@ public: ///Writes a HTML representation of the schedule of CPUs and buses to an output file void schedule2HTML(std::string& iTraceFileName) const; void timeline2HTML(std::string& iTracetaskList, std::ostringstream& myfile) const; + std::string getTaskCellStatus(int i) const; ///Writes simulation traces in VCD format to an output file /** diff --git a/ttool/src/test/java/tmltranslator/DiplodocusTerminatedTest.java b/ttool/src/test/java/tmltranslator/DiplodocusSimulatorTerminationTest.java similarity index 97% rename from ttool/src/test/java/tmltranslator/DiplodocusTerminatedTest.java rename to ttool/src/test/java/tmltranslator/DiplodocusSimulatorTerminationTest.java index c8fb3b31de39057ef65de4127e4c0a4933ffce85..c7bb462d23ce4c481df05dd3173105c540268900 100644 --- a/ttool/src/test/java/tmltranslator/DiplodocusTerminatedTest.java +++ b/ttool/src/test/java/tmltranslator/DiplodocusSimulatorTerminationTest.java @@ -2,7 +2,6 @@ package tmltranslator; import common.ConfigurationTTool; import common.SpecConfigTTool; -import myutil.FileUtils; import myutil.TraceManager; import org.junit.Before; import org.junit.BeforeClass; @@ -24,14 +23,13 @@ import ui.tmldd.TMLArchiDiagramPanel; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Vector; import static org.junit.Assert.assertTrue; -public class DiplodocusTerminatedTest extends AbstractUITest { +public class DiplodocusSimulatorTerminationTest extends AbstractUITest { final String DIR_GEN = "test_diplo_simulator/"; final String [] MODELS_TERMINATE = {"terminatedTest"}; private String SIM_DIR; @@ -46,7 +44,7 @@ public class DiplodocusTerminatedTest extends AbstractUITest { } - public DiplodocusTerminatedTest() { + public DiplodocusSimulatorTerminationTest() { super(); } @@ -167,7 +165,7 @@ public class DiplodocusTerminatedTest extends AbstractUITest { } try { - toServer(" 1 0", rc); + toServer(" 1 6 500", rc); Thread.sleep(5); while (running) { String demo = null; diff --git a/ttool/src/test/resources/tmltranslator/expected/expected_get_generated_timeline.txt b/ttool/src/test/resources/tmltranslator/expected/expected_get_generated_timeline.txt index 88a26fbe61c974cd0b2c8df2ad6c2bfd02cd03e9..0e633f9c754cadca9deda98799cb0e42c6151add 100644 --- a/ttool/src/test/resources/tmltranslator/expected/expected_get_generated_timeline.txt +++ b/ttool/src/test/resources/tmltranslator/expected/expected_get_generated_timeline.txt @@ -1,147 +1,5 @@ -<!DOCTYPE html> -<html> -<head> -<style> -table{ - border-collapse: collapse; - empty-cells: show; - margin: 0.4cm; - } - td{ - padding: 10px 5px; - border: 1px solid black; - max-width: 5px; - } - th{ - padding: 5px; - } - .sc{ - border-style: none; - padding: 0px; - font-size: small; - transform: rotate(45deg); - transform-origin: left top; - } - .sc1{ - border-style: none; - padding: 0px; - font-size: small; - color: red; - transform: rotate(45deg); - transform-origin: left top; - } - h2 { - border-bottom: 1px solid #666; - } - h2 span { - position: relative; - left: -0.3em; - bottom: -0.6em; - padding: 1px 0.5em; - border-style: solid; - border-width: 1px 1px 1px 0.8em; - border-color: #666 #666 #666 #008; - background-color: #ddd; - } - .space{border-style: none;} - .not{background-color: white; text-align: center} - .notfirst{ - background-color: white; - border-width: 2px; - border-color: red; - border-style: none solid none none; - } - .notmid { - background-color: white; - text-align: right; - border-style: solid none none none; - } - .notlast { - background-color: white; - width: 5px; - border-style: none none none none; - } - .t0{background-color: yellow;} - .t1{background-color: purple;} - .t2{background-color: red;} - .t3{background-color: silver;} - .t4{background-color: teal;} - .t5{background-color: aqua;} - .t6{background-color: olive;} - .t7{background-color: navy;} - .t8{background-color: maroon;} - .t9{background-color: lime;} - .t10{background-color: green;} - .t11{background-color: gray;} - .t12{background-color: fuchsia;} - .t13{background-color: blue;} - .t14{background-color: darkred;} - .wrapper { - width: 256px; - height: 256px; - } - .clear { - clear:both - } -</style> -<title>Timeline Diagram</title> -</head> -<body> -<table style="float: left;position: relative;"><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td> -<td class="notfirst"></td> -<td style="border-style: solid none none none; border-width: 2px;border-color: red;text-align:right"colspan="500"><b>Time</b></td> -</tr> -<tr><th></th><th class="notfirst"></th></tr> -<div class = "clear"></div> -<tr><td title = "Average load: 0.99; Utilization: 0.99" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">FPGA1_1_core_0</td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" title="idle time" class="not"></td> -<td colspan="1" title="ApplicationSimple__T1: Wait ApplicationSimple__evtToT1__ApplicationSimple__evtToT1 params: t:1 l:1 (vl:1) params:(100(size)) Ch: ApplicationSimple__evtToT1__ApplicationSimple__evtToT1" class="t0"> W</td> -<td colspan="4" title="idle time" class="not"></td> -<td colspan="10" title="ApplicationSimple__T1: Read 400,ApplicationSimple__chToT1 t:6 l:400 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t0"> R</td> -</tr> -<tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" class="sc">0</td><td colspan="1" class="sc">1</td><td colspan="4" class="sc">2</td><td colspan="10" class="sc">6</td><td colspan="5" class="sc">406</td></tr> -<tr><th></th><th class="notfirst"><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr> - -<div class = "clear"></div> -<tr><td title = "Average load: 1; Utilization: 0.015" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">Src_1_core_0</td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" title="ApplicationSimple__Src: Send ApplicationSimple__evtToT1__ApplicationSimple__evtToT1(evtFB) len:2 content:0 params: t:0 l:1 (vl:1) params:(100(size)) Ch: ApplicationSimple__evtToT1__ApplicationSimple__evtToT1" class="t1"> S</td> -<td colspan="5" title="ApplicationSimple__Src: Write 400,ApplicationSimple__chToT1 t:1 l:5 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t1"> W</td> -</tr> -<tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" class="sc">0</td><td colspan="5" class="sc">1</td><td colspan="5" class="sc">6</td></tr> -<tr><th></th><th class="notfirst"><th></th><th></th><th></th><th></th><th></th><th></th></tr> - -<div class = "clear"></div> -<tr><td title = "Average load: 0.83; Utilization: 0.012" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">Bus0_0</td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" title="idle time" class="not"></td> -<td colspan="5" title="ApplicationSimple__Src: Write 400,ApplicationSimple__chToT1 t:1 l:5 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t1"> W</td> -</tr> -<tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td> -<td class="notfirst"></td> -<td class="notlast"></td> -<td colspan="1" class="sc">0</td><td colspan="5" class="sc">1</td><td colspan="5" class="sc">6</td></tr> -<tr><th></th><th class="notfirst"><th></th><th></th><th></th><th></th><th></th><th></th></tr> -<div class = "clear"></div> -</tr> -<tr><th></th><th class="notfirst"></th></tr> -<div class = "clear"></div> -</table> -<table> -<tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td> -<td class="notlast"></td> -<td class="notlast"></td> -<td class="t0"></td><td style="max-width: unset;min-width: 170px;">ApplicationSimple__T1</td><td class="space"></td><td class="t1"></td><td style="max-width: unset;min-width: 170px;">ApplicationSimple__Src</td><td class="space"></td></tr> -</table> -</body> -</html> \ No newline at end of file +<!DOCTYPE html><html><head><style>table{border-collapse: collapse;empty-cells: show;margin: 0.4cm;}td{padding: 10px 5px;border: 1px solid black;max-width: 5px;}th{padding: 5px;}.sc{border-style: none;padding: 0px;font-size: small;transform: rotate(45deg);transform-origin: left top;}.sc1{border-style: none;padding: 0px;font-size: small;color: red;transform: rotate(45deg);transform-origin: left top;}h2{border-bottom: 1px solid #666;}h2 span {position: relative;left: -0.3em;bottom: -0.6em;padding: 1px 0.5em;border-style: solid;border-width: 1px 1px 1px 0.8em;border-color: #666 #666 #666 #008;background-color: #ddd; } .space{border-style: none;} .not{background-color: white; text-align: center} .notfirst{background-color: white;border-width: 2px;border-color: red;border-style: none solid none none; } .notmid {background-color: white;text-align: right;border-style: solid none none none; } .notlast {background-color: white;width: 5px;border-style: none none none none; } .t0{background-color: yellow;} .t1{background-color: purple;} .t2{background-color: red;} .t3{background-color: silver;} .t4{background-color: teal;} .t5{background-color: aqua;} .t6{background-color: olive;} .t7{background-color: navy;} .t8{background-color: maroon;} .t9{background-color: lime;} .t10{background-color: green;} .t11{background-color: gray;} .t12{background-color: fuchsia;} .t13{background-color: blue;} .t14{background-color: darkred;}.wrapper {width: 256px;height: 256px; } .clear {clear:both}</style><title>Timeline Diagram</title></head><body> +<table style="float: left;position: relative;"><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notfirst"></td><td style="border-style: solid none none none; border-width: 2px;border-color: red;text-align:right"colspan="500"><b>Time</b></td></tr><tr><th></th><th class="notfirst"></th></tr><div class = "clear"></div><tr><td title = "Average load: 0.99; Utilization: 0.99" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">FPGA1_1_core_0</td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" title="idle time" class="not"></td><td colspan="1" title="ApplicationSimple__T1: Wait ApplicationSimple__evtToT1__ApplicationSimple__evtToT1 params: t:1 l:1 (vl:1) params:(100(size)) Ch: ApplicationSimple__evtToT1__ApplicationSimple__evtToT1" class="t0"> W</td><td colspan="4" title="idle time" class="not"></td><td colspan="10" title="ApplicationSimple__T1: Read 400,ApplicationSimple__chToT1 t:6 l:400 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t0"> R</td></tr><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" class="sc">0</td><td colspan="1" class="sc">1</td><td colspan="4" class="sc">2</td><td colspan="10" class="sc">6</td><td colspan="5" class="sc">406</td></tr><tr><th></th><th class="notfirst"><th></th></tr><div class = "clear"></div> +<tr><td title = "Average load: 1; Utilization: 0.015" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">Src_1_core_0</td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" title="ApplicationSimple__Src: Send ApplicationSimple__evtToT1__ApplicationSimple__evtToT1(evtFB) len:2 content:0 params: t:0 l:1 (vl:1) params:(100(size)) Ch: ApplicationSimple__evtToT1__ApplicationSimple__evtToT1" class="t1"> S</td><td colspan="5" title="ApplicationSimple__Src: Write 400,ApplicationSimple__chToT1 t:1 l:5 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t1"> W</td></tr><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" class="sc">0</td><td colspan="5" class="sc">1</td><td colspan="5" class="sc">6</td></tr><tr><th></th><th class="notfirst"><th></th></tr><div class = "clear"></div> +<tr><td title = "Average load: 0.83; Utilization: 0.012" width="170px" style="max-width: unset;min-width: 170px;background-color: aqua;">Bus0_0</td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" title="idle time" class="not"></td><td colspan="5" title="ApplicationSimple__Src: Write 400,ApplicationSimple__chToT1 t:1 l:5 (vl:400) params: Ch: ApplicationSimple__chToT1" class="t1"> W</td></tr><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notfirst"></td><td class="notlast"></td><td colspan="1" class="sc">0</td><td colspan="5" class="sc">1</td><td colspan="5" class="sc">6</td></tr><tr><th></th><th class="notfirst"><th></th></tr><div class = "clear"></div> +</tr><tr><th></th><th class="notfirst"></th></tr><div class = "clear"></div><th></th><th class="notfirst"><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></table><table><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notlast"></td><td class="notlast"></td><td class="t0"></td><td style="max-width: unset;min-width: 170px;">ApplicationSimple__T1</td><td class="space"></td><td class="t1"></td><td style="max-width: unset;min-width: 170px;">ApplicationSimple__Src</td><td class="space"></td></tr><tr><td width="170px" style="max-width: unset;min-width: 170px;border-style: none none none none;"></td><td class="notlast"></td><td class="notlast"></td><td style="border-style: none none none none;"></td><td style="max-width: unset;min-width: 170px;border-style: none none none none;color:green"><b>Running</b></td><td class="space"></td><td style="border-style: none none none none;"></td><td style="max-width: unset;min-width: 170px;border-style: none none none none;color:red"><b>Terminated</b></td><td class="space"></td></tr></table></body></html> \ No newline at end of file