Skip to content
Snippets Groups Projects
Select Git revision
  • b6c6601e82c03d437a45734071400bbd2b0d917a
  • master default protected
2 results

chartspage.cpp

Blame
  • dp3n18's avatar
    dp3n18 authored
    b6c6601e
    History
    chartspage.cpp 10.84 KiB
    #include "chartspage.h"
    #include "packet.h"
    
    ChartsPage::ChartsPage(bool isSys,bool isFPGA, bool isMbox, bool isCore, bool isThread, int boardX,int boardY,int mboxX,int mboxY,int coreID, int threadID,int maxValues) {
        this->boardX = boardX;
        this->boardY = boardY;
        this->mboxXA = mboxX;
        this->mboxYA = mboxY;
        this->coreid = coreID;
        this->threadid = threadID;
        this->maxValues = maxValues;
    
        if (isSys) {
            this->isSys = true;
            this->isFpga = false;
            this->isMbox = false;
            this->isCore = false;
            this->isThread = false;
        }
        else if (isFPGA) {
            this->isSys = false;
            this->isFpga = true;
            this->isMbox = false;
            this->isCore = false;
            this->isThread = false;
    
        }
        else if (isMbox) {
            this->isSys = false;
            this->isFpga = false;
            this->isMbox = true;
            this->isCore = false;
            this->isThread = false;
        }
        else if (isCore) {
            this->isSys = false;
            this->isFpga = false;
            this->isMbox = false;
            this->isCore = true;
            this->isThread = false;
        }
        else if (isThread){
            this->isSys = false;
            this->isFpga = false;
            this->isMbox = false;
            this->isCore = false;
            this->isThread = true;
        }
    
    }
    
    
    
    
    
    
    
        void ChartsPage::receivePacket(Packet &p) {
    
            // check the page type, then check ID values, either add packet values to buffers or skip.
    
            if (this->isSys) {
                //accept all packets
                //lock and update buffers
                queueLock.lock();
                recLock.lock();
                utilLock.lock();
                chrLock.lock();
                msentBuffer.enqueue(p.messagesSent);
                this->mreceivedBuffer.enqueue(p.messagesReceived);
                this->utilBuffer.enqueue(p.Utilization);
                this->chrBuffer.enqueue(p.CacheHitRate);
    
                //all the same size so if one is over limit then dequeue
                if (this->msentBuffer.size() > this->maxValues) {
    
                    msentBuffer.dequeue();
    
                }
                if (this->mreceivedBuffer.size() > this->maxValues) {
                    mreceivedBuffer.dequeue();
    
                }
                if (this->utilBuffer.size() > this->maxValues) {
                    utilBuffer.dequeue();
    
                }
                if (this->chrBuffer.size() > this->maxValues) {
                    chrBuffer.dequeue();
    
                }
                queueLock.unlock();
                recLock.unlock();
                utilLock.unlock();
                chrLock.unlock();
    
    
    
            }
    
    
    
            else if (this->isFpga) {
    
                //only accept data from particular fpga from sender.
                if (p.BoardX == this->boardX && p.BoardY == this->boardY) {
                    //accept
                    queueLock.lock();
                    recLock.lock();
                    utilLock.lock();
                    chrLock.lock();
                    msentBuffer.enqueue(p.messagesSent);
                    this->mreceivedBuffer.enqueue(p.messagesReceived);
                    this->utilBuffer.enqueue(p.Utilization);
                    this->chrBuffer.enqueue(p.CacheHitRate);
    
                    //all the same size so if one is over limit then dequeue
                    if (this->msentBuffer.size() > this->maxValues) {
    
                        msentBuffer.dequeue();
                    }
                    if (this->mreceivedBuffer.size() > this->maxValues) {
                        mreceivedBuffer.dequeue();
                    }
                    if (this->utilBuffer.size() > this->maxValues) {
                        utilBuffer.dequeue();
                    }
                    if (this->chrBuffer.size() > this->maxValues) {
                        chrBuffer.dequeue();
                    }
                    queueLock.unlock();
                    recLock.unlock();
                    utilLock.unlock();
                    chrLock.unlock();;
                }
            }
    
            else if (this->isMbox) {
                int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
                int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
    
                if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA ) {
                    //accept
                    queueLock.lock();
                    recLock.lock();
                    utilLock.lock();
                    chrLock.lock();
                    msentBuffer.enqueue(p.messagesSent);
                    this->mreceivedBuffer.enqueue(p.messagesReceived);
                    this->utilBuffer.enqueue(p.Utilization);
                    this->chrBuffer.enqueue(p.CacheHitRate);
    
                    //all the same size so if one is over limit then dequeue
                    if (this->msentBuffer.size() > this->maxValues) {
    
                        msentBuffer.dequeue();
                    }
                    if (this->mreceivedBuffer.size() > this->maxValues) {
                        mreceivedBuffer.dequeue();
                    }
                    if (this->utilBuffer.size() > this->maxValues) {
                        utilBuffer.dequeue();
                    }
                    if (this->chrBuffer.size() > this->maxValues) {
                        chrBuffer.dequeue();
                    }
                    queueLock.unlock();
                    recLock.unlock();
                    utilLock.unlock();
                    chrLock.unlock();
                }
            }
    
            else if (this->isCore) {
                int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
                int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
                if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA&&p.core == this->coreid) {
                    //acept
    
                        //accept
                        queueLock.lock();
                        recLock.lock();
                        utilLock.lock();
                        chrLock.lock();
                        msentBuffer.enqueue(p.messagesSent);
                        this->mreceivedBuffer.enqueue(p.messagesReceived);
                        this->utilBuffer.enqueue(p.Utilization);
                        this->chrBuffer.enqueue(p.CacheHitRate);
    
                        //all the same size so if one is over limit then dequeue
                        if (this->msentBuffer.size() > this->maxValues) {
    
                            msentBuffer.dequeue();
                        }
                        if (this->mreceivedBuffer.size() > this->maxValues) {
                            mreceivedBuffer.dequeue();
                        }
                        if (this->utilBuffer.size() > this->maxValues) {
                            utilBuffer.dequeue();
                        }
                        if (this->chrBuffer.size() > this->maxValues) {
                            chrBuffer.dequeue();
                        }
                        queueLock.unlock();
                        recLock.unlock();
                        utilLock.unlock();
                        chrLock.unlock();
    
    
    
    
        }
            }
    
            else if (this->isThread) {
                int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
                int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
                 if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA &&  p.core == this->coreid && p.thread == this->threadid) {
                     //accept
                     queueLock.lock();
                     recLock.lock();
                     utilLock.lock();
                     chrLock.lock();
                     msentBuffer.enqueue(p.messagesSent);
                     this->mreceivedBuffer.enqueue(p.messagesReceived);
                     this->utilBuffer.enqueue(p.Utilization);
                     this->chrBuffer.enqueue(p.CacheHitRate);
    
                     //all the same size so if one is over limit then dequeue
                     if (this->msentBuffer.size() > this->maxValues) {
    
                         msentBuffer.dequeue();
                     }
                     if (this->mreceivedBuffer.size() > this->maxValues) {
                         mreceivedBuffer.dequeue();
                     }
                     if (this->utilBuffer.size() > this->maxValues) {
                         utilBuffer.dequeue();
                     }
                     if (this->chrBuffer.size() > this->maxValues) {
                         chrBuffer.dequeue();
                     }
                     queueLock.unlock();
                     recLock.unlock();
                     utilLock.unlock();
                     chrLock.unlock();
    
                 }
            }
        }
    
    
       float ChartsPage::dequeueSentElement() {
            queueLock.lock();
            float get;
            if (!msentBuffer.isEmpty()) {
             get = msentBuffer.dequeue();
            }
            else {
                get = 0;
            }
            queueLock.unlock();
            return get;
        }
    
       float ChartsPage::dequeueRecElement() {
            recLock.lock();
            float get;
            if (!mreceivedBuffer.isEmpty()) {
             get = mreceivedBuffer.dequeue();
            }
            else {
                get = 0;
            }
            recLock.unlock();
            return get;
        }
    
    
       float ChartsPage::dequeueUtilElement() {
            utilLock.lock();
            float get;
            if (!utilBuffer.isEmpty()) {
             get = utilBuffer.dequeue();
            }
            else {
                get = 0;
            }
            utilLock.unlock();
            return get;
        }
       float ChartsPage::dequeueCHRElement() {
            chrLock.lock();
            float get;
            if (!chrBuffer.isEmpty()) {
             get = chrBuffer.dequeue();
            }
            else {
                get = 0;
            }
            chrLock.unlock();
            return get;
        }
    
    
       float ChartsPage::reCalculateSent() {
           queueLock.lock();
    
    
    
           if (this->msentBuffer.size() > 0) {
           this->msent  = std::accumulate(std::begin(msentBuffer), std::end(msentBuffer), 0.0) / maxValues;
              // msentBuffer.enqueue(0); //for constnat data flow. REMOVE IF SENDER IS CONSTANTLY SENDING PACKETS CONSISTENTLY AND EVENLY.
               msentBuffer.dequeue();
               //msentBuffer.clear();
           }
           else {
               this->msent = 0;
    
           }
    
    
           queueLock.unlock();
    
           return msent;
    
       }
    
       float ChartsPage::reCalculateReceived() {
           recLock.lock();
           if (this->mreceivedBuffer.size() >0) {
         this->mreceived  = std::accumulate(std::begin(mreceivedBuffer), std::end(mreceivedBuffer), 0.0) / maxValues;
              // msentBuffer.clear();
               mreceivedBuffer.dequeue();
           }
           else {
               this->mreceived=  0;
           }
           recLock.unlock();
           return mreceived;
    
       }
    
       float ChartsPage::reCalculateCHR() {
           //mutex.lock();
           chrLock.lock();
           if (chrBuffer.size() > 0){
           this->chr  = std::accumulate(std::begin(chrBuffer), std::end(chrBuffer), 0.0) / maxValues;
    
               //built in for a smooth flow of data...
               chrBuffer.dequeue();
    
           }
           else {
               this->chr = 0;
           }
    
           chrLock.unlock();
           return this->chr;
       }
    
       float ChartsPage::reCalculateutil() {
           utilLock.lock();
       if (this->utilBuffer.size() > 0) {
            this->util  = std::accumulate(std::begin(utilBuffer), std::end(utilBuffer), 0.0) / maxValues;
           //utilBuffer.clear();
           utilBuffer.dequeue();
    
       }
       else {
           util = 0;
       }
           utilLock.unlock();
           return util;
       }
    
    
       ChartsPage::~ChartsPage() {
    
       }