diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp index 4e2204c050f619b997dcfc293f3429551cc0e8d2..d587485be940821ec5e0c27b7b5c9309e0cb742e 100644 --- a/simulators/c++2/src_simulator/arch/FPGA.cpp +++ b/simulators/c++2/src_simulator/arch/FPGA.cpp @@ -367,6 +367,16 @@ std::string FPGA::toShortString() const{ return outp.str(); } +void FPGA::reset(){ + SchedulableDevice::reset(); + _scheduler->reset(); + _transactList.clear(); + _nextTransaction=0; + _lastTransaction=0; + _masterNextTransaction=0; + _busyCycles=0; +} + void FPGA::schedule2TXT(std::ofstream& myfile) const{ myfile << "========= Scheduling for device: "<< _name << " =========\n" ; for(TransactionList::const_iterator i=_transactList.begin(); i != _transactList.end(); ++i){ diff --git a/simulators/c++2/src_simulator/arch/FPGA.h b/simulators/c++2/src_simulator/arch/FPGA.h index 9c8038f459875585a4e61197df61d29b796d4541..36fe46049edd610b942f713f9d7b3c175cccb674 100644 --- a/simulators/c++2/src_simulator/arch/FPGA.h +++ b/simulators/c++2/src_simulator/arch/FPGA.h @@ -119,6 +119,7 @@ public: virtual void addBusMaster(BusMaster* iMaster){ _busMasterList.push_back(iMaster); } + virtual void reset(); ///Stores a new task in the internal task list /** \param iTask Pointer to the task to add diff --git a/simulators/c++2/src_simulator/arch/OrderScheduler.cpp b/simulators/c++2/src_simulator/arch/OrderScheduler.cpp index 1400cd7d04c5bd15642228ca0a615f4639b21455..c2e3a67f8993f01305b59ec190dac48032f320d2 100644 --- a/simulators/c++2/src_simulator/arch/OrderScheduler.cpp +++ b/simulators/c++2/src_simulator/arch/OrderScheduler.cpp @@ -49,39 +49,41 @@ OrderScheduler::OrderScheduler(const std::string& iName, Priority iPrio, Workloa TMLTime OrderScheduler::schedule(TMLTime iEndSchedule){ std::cout<<"order scheduler "<<std::endl; TaskList::iterator i; - TMLTransaction *aMarkerPast=0, *aMarkerFuture=0,*aTempTrans; - TMLTime aTransTimeFuture=-1,aRunnableTime; - WorkloadSource *aSourcePast=0, *aSourceFuture=0; //NEW - for(WorkloadList::iterator i=_workloadList.begin(); i != _workloadList.end(); ++i){ - aTempTrans=(*i)->getNextTransaction(iEndSchedule); - // if(aTempTrans) std::cout<<"show temp trans"<<aTempTrans->toShortString()<<std::endl; - if (aTempTrans!=0 && aTempTrans->getVirtualLength()!=0 && aTempTrans->getCommand()->getTask()->getFPGA()){ - aRunnableTime=aTempTrans->getRunnableTime(); - if (aRunnableTime<=iEndSchedule){ - //Past - aMarkerPast=aTempTrans; - aSourcePast=*i; //NEW - - }else{ - //Future - - aTransTimeFuture=aRunnableTime; - aMarkerFuture=aTempTrans; - aSourceFuture=*i; //NEW - - - } - } - - } - if (aMarkerPast==0){ - _nextTransaction=aMarkerFuture; - _lastSource=aSourceFuture; //NEW - }else{ - _nextTransaction=aMarkerPast; - _lastSource=aSourcePast; //NEW - } + //std::cout << _name << ": Schedule called \n"; + TMLTransaction *anOldTransaction = _nextTransaction, *aTempTrans; + TMLTime aLowestRunnableTimeFuture=-1, aRunnableTime, aLowestRunnableTimePast=-1; + WorkloadSource *aSourcePast=0, *aSourceFuture=0; + //std::cout << _name << ": Second if\n"; + for(WorkloadList::iterator i=_workloadList.begin(); i != _workloadList.end(); ++i){ + (*i)->schedule(iEndSchedule); + //std::cout << _name << " schedules, before getCurrTransaction " << std::endl; + aTempTrans=(*i)->getNextTransaction(iEndSchedule); + //std::cout << "after getCurrTransaction " << std::endl; + if (aTempTrans!=0 && aTempTrans->getVirtualLength()!=0){ + aRunnableTime=aTempTrans->getRunnableTime(); + if (aRunnableTime<=iEndSchedule){ + //Past + if (aRunnableTime<aLowestRunnableTimePast){ + aLowestRunnableTimePast=aRunnableTime; + aSourcePast=*i; + } + }else{ + //Future + if(aRunnableTime<aLowestRunnableTimeFuture){ + aLowestRunnableTimeFuture=aRunnableTime; + aSourceFuture=*i; + } + } + } + } + if (aSourcePast==0){ + _nextTransaction=(aSourceFuture==0)? 0 : aSourceFuture->getNextTransaction(iEndSchedule); + _lastSource=aSourceFuture; + }else{ + _nextTransaction=aSourcePast->getNextTransaction(iEndSchedule); + _lastSource=aSourcePast; + } #ifdef DEBUG_FPGA if(_nextTransaction) std::cout<<"order next trans is "<<_nextTransaction->toShortString()<<std::endl; else std::cout<<"order next trans is 0"<<std::endl; diff --git a/simulators/c++2/src_simulator/evt/ListenersSimCmd.cpp b/simulators/c++2/src_simulator/evt/ListenersSimCmd.cpp index 054568dbda5d0e76ef80c8961a198ccda23bd011..4d6138ac10912641477c266c13ff46030599d1e8 100644 --- a/simulators/c++2/src_simulator/evt/ListenersSimCmd.cpp +++ b/simulators/c++2/src_simulator/evt/ListenersSimCmd.cpp @@ -49,6 +49,7 @@ Ludovic Apvrille, Renaud Pacalet #include <TMLTask.h> #include <dlfcn.h> #include <CPU.h> +#include <FPGA.h> #define COND_SOURCE_FILE_NAME "newlib.c" #define COND_OBJ_FILE_NAME "newlib.o" @@ -60,12 +61,16 @@ bool CondBreakpoint::_enabled=true; //************************************************************************ RunXTransactions::RunXTransactions(SimComponents* iSimComp, unsigned int iTransToExecute):_simComp(iSimComp), _count(0), _transToExecute(iTransToExecute){ for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i) - (*i)->registerListener(this); + (*i)->registerListener(this); + for(FPGAList::const_iterator j=_simComp->getFPGAList().begin(); j != _simComp->getFPGAList().end(); ++j) + (*j)->registerListener(this); } RunXTransactions::~RunXTransactions(){ for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i) (*i)->removeListener(this); + for(FPGAList::const_iterator j=_simComp->getFPGAList().begin(); j != _simComp->getFPGAList().end(); ++j) + (*j)->removeListener(this); } void RunXTransactions::transExecuted(TMLTransaction* iTrans, ID iID){ @@ -248,12 +253,16 @@ void RunXCommands::setCmdsToExecute(unsigned int iCommandsToExecute){ //************************************************************************ RunXTimeUnits::RunXTimeUnits(SimComponents* iSimComp, TMLTime iEndTime):_simComp(iSimComp), _endTime(iEndTime){ for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i) - (*i)->registerListener(this); + (*i)->registerListener(this); + for(FPGAList::const_iterator j=_simComp->getFPGAList().begin(); j != _simComp->getFPGAList().end(); ++j) + (*j)->registerListener(this); } RunXTimeUnits::~RunXTimeUnits(){ for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i) (*i)->removeListener(this); + for(FPGAList::const_iterator j=_simComp->getFPGAList().begin(); j != _simComp->getFPGAList().end(); ++j) + (*j)->removeListener(this); } void RunXTimeUnits::transExecuted(TMLTransaction* iTrans, ID iID){