vcaMsgAware.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "vcaMsgAware.h"
00027
00028 VcaMsgAware::VcaMsgAware()
00029 {
00030 }
00031
00032 VcaMsgAware::~VcaMsgAware()
00033 {
00034 }
00035
00036 void
00037 VcaMsgAware::set_no_msg_classes ( uint no )
00038 {
00039 no_mclasses = no;
00040 return ;
00041 }
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 }
00072
00073
00074 void
00075 VcaMsgAware::request ( uint op, uint msg_id, uint req_id, ullint at )
00076 {
00077
00078
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 }
00094
00095
00105 uint
00106 VcaMsgAware::pick_winners ()
00107 {
00108 uint winner_count = 0;
00109
00110
00111
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 }
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 }
00152
00153
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 }
00170