vcaMsgAware.cc

Go to the documentation of this file.
00001 /*
00002  * =====================================================================================
00003  *
00004  *       Filename:  vcaMsgAware.cc
00005  *
00006  *    Description:  This is a pseudo-component that does vca in a noc with
00007  *    multiple msg_classes.
00008  *    Every msg_class is said to heave a msg_id which indicates the priority.
00009  *    Vca is done for input packets based on this priority.
00010  *
00011  *    Need to add: If a winner includes the highest priority pkt then no more winners for
00012  *    that output port are picked even if there are empty vcs to ensure that
00013  *    the packet is never blocked.
00014  *
00015  *        Version:  1.0
00016  *        Created:  10/18/2010 01:03:57 PM
00017  *       Revision:  none
00018  *       Compiler:  gcc
00019  *
00020  *         Author:  Mitchelle Rasquinha (), mitchelle.rasquinha@gatech.edu
00021  *        Company:  Georgia Institute of Technology
00022  *
00023  * =====================================================================================
00024  */
00025 
00026 #include        "vcaMsgAware.h"
00027 
00028 VcaMsgAware::VcaMsgAware()
00029 {
00030 }  /* -----  end of method VcaMsgAware::VcaMsgAware  (constructor)  ----- */
00031 
00032 VcaMsgAware::~VcaMsgAware()
00033 {
00034 }  /* -----  end of method VcaMsgAware::~VcaMsgAware  (destructor)  ----- */
00035 
00036 void
00037 VcaMsgAware::set_no_msg_classes ( uint no )
00038 {
00039     no_mclasses = no;
00040     return ;
00041 }               /* -----  end of method VcaMsgAware::set_no_msg_classes  ----- */
00042 
00043 void
00044 VcaMsgAware::init ( uint op, uint vc )
00045 {
00046     ports = op;
00047     vcs = vc;
00048     arbiter.resize(no_mclasses);
00049     arbiter_arrival_time.resize(no_mclasses);
00050     available_vcs.resize(no_mclasses);
00051     winners.resize(no_mclasses);
00052 
00053     for ( uint i=0; i<no_mclasses ;i++ ) {
00054         arbiter[i].resize(ports);
00055         arbiter_arrival_time[i].resize(ports);
00056         winners[i].resize(ports);
00057         available_vcs[i].resize(ports);
00058     }
00059 
00060     for ( uint i=0; i<no_mclasses ;i++ ) 
00061         for ( uint j=0; j<ports;j++ ) 
00062         {
00063             arbiter[i][j].clear();
00064             arbiter_arrival_time[i][j].clear();
00065             winners[i][j].clear();
00066             available_vcs[i][j].clear();
00067             for ( uint k=0; k<(vcs/no_mclasses);k++ ) 
00068                 available_vcs[i][j].push_back(i*no_mclasses+k);
00069         }
00070     return ;
00071 }               /* -----  end of method VcaMsgAware::init  ----- */
00072 
00073 
00074 void
00075 VcaMsgAware::request ( uint op, uint msg_id, uint req_id, ullint at )
00076 {
00077     /* pool all the requestors based on msg_id and outport. Msg id 0 has
00078      * highest priority */
00079     vector<uint>::iterator it;
00080     it = find (arbiter[msg_id][op].begin(), arbiter[msg_id][op].end(), req_id);
00081     if( it == arbiter[msg_id][op].end())
00082     {
00083         arbiter[msg_id][op].push_back(req_id);
00084         arbiter_arrival_time[msg_id][op].push_back(at);
00085     }
00086 
00087 #ifdef _DEBUG
00088     else
00089         cout    << "already in requestor list" << req_id << endl;
00090 #endif
00091 
00092     return ;
00093 }               /* -----  end of method VcaMsgAware::request  ----- */
00094 
00095 
00105 uint
00106 VcaMsgAware::pick_winners ()
00107 {
00108     uint winner_count = 0;
00109     /* Msg id 0 has highest priority. Sort pooled mssgs on arrival time and
00110      * assign vcs. return the number of msgs that got allocated a vc in this
00111      * invocation of the method. */
00112     for ( uint i=0; i<no_mclasses ; i++ ) 
00113         for ( uint j=0; j<ports ; j++ ) 
00114         {
00115             ullint min_t = -1;
00116             vector<ullint> sorted_msgs;
00117             if(available_vcs[i][j].size())
00118             {
00119                 uint msg_index  = 999;
00120                 for ( uint k=0; k<arbiter[i][j].size();k++ ) 
00121                 {
00122                     if ( arbiter_arrival_time[i][j][k] < min_t )
00123                         msg_index = arbiter[i][j][k];
00124                 }
00125 
00126                 if(msg_index != 999 )
00127                 {
00128                     uint winner_oc = available_vcs[i][j].front();
00129                     available_vcs[i][j].pop_front();
00130                     winners[i][j].insert(winners[i][j].end(),make_pair(msg_index,winner_oc));
00131                     vector<uint>::iterator it = find (arbiter[i][j].begin(), arbiter[i][j].end(), msg_index);
00132                     arbiter[i][j].erase(it);
00133                     winner_count++;
00134                 }
00135             }
00136 
00137         }
00138 
00139     return winner_count;
00140 }               /* -----  end of method VcaMsgAware::pick_winners  ----- */
00141 
00142 uint
00143 VcaMsgAware::get_no_requestors ( void )
00144 {
00145     uint count = 0;
00146     for ( uint i=0; i<no_mclasses ; i++ ) 
00147         for ( uint j=0; j<ports ; j++ ) 
00148             count += arbiter[i][j].size();
00149 
00150     return count ;
00151 }               /* -----  end of method VcaMsgAware::get_no_requestors  ----- */
00152 
00153 /*  Assumes tht the input requestor was a winner for one op and one mc only */
00154 void
00155 VcaMsgAware::clear_winner ( uint winner, uint oc)
00156 {
00157     for ( uint i=0; i<no_mclasses ; i++ ) 
00158         for ( uint j=0; j<ports ; j++ ){ 
00159             map<uint,uint>::iterator it = winners[i][j].find(winner);
00160             if ( it != winners[i][j].end() )
00161             {
00162                 winners[i][j].erase(it);
00163                 available_vcs[i][j].push_back(oc);
00164                 break;
00165             }
00166         }
00167 
00168     return ;
00169 }               /* -----  end of method VcaMsgAware::clear_winner  ----- */
00170 

Generated on Tue Oct 19 17:22:01 2010 for IRIS by  doxygen 1.5.8