00001 00018 #ifndef _genericbuffer_cc_INC 00019 #define _genericbuffer_cc_INC 00020 00021 #include "genericBuffer.h" 00022 00023 GenericBuffer::GenericBuffer () 00024 { 00025 pull_channel = 0; 00026 push_channel = 0; 00027 } /* ----- end of function GenericBuffer::GenericBuffer ----- */ 00028 00029 GenericBuffer::~GenericBuffer () 00030 { 00031 } 00032 00033 void 00034 GenericBuffer::push ( Flit* f ) 00035 { 00036 buffers[push_channel].push_back(f); 00037 assert(buffers[push_channel].size() <= buffer_size); 00038 return; 00039 } /* ----- end of function GenericBuffer::push ----- */ 00040 00041 Flit* 00042 GenericBuffer::pull () 00043 { 00044 if( pull_channel > buffers.size() || buffers[pull_channel].size() == 0) 00045 { 00046 fprintf( stdout, "\nERROR: Invalid pull channel pull_ch:%d no_of_ch:%d buff_occ:%d", 00047 pull_channel, buffers.size(),buffers[pull_channel].size()); 00048 exit(1); 00049 } 00050 Flit* f = buffers[pull_channel].front(); 00051 buffers[pull_channel].pop_front(); 00052 assert(buffers[pull_channel].size() <= buffer_size); 00053 return f; 00054 } /* ----- end of function GenericBuffer::pull ----- */ 00055 00064 Flit* 00065 GenericBuffer::peek () 00066 { 00067 if( pull_channel > buffers.size() || buffers[pull_channel].size() == 0) 00068 { 00069 fprintf( stdout, "\nERROR: **Invalid pull channel"); 00070 exit(1); 00071 } 00072 Flit* f = buffers[pull_channel].front(); 00073 assert(buffers[pull_channel].size() <= buffer_size); 00074 return f; 00075 } /* ----- end of function GenericBuffer::pull ----- */ 00076 00077 uint 00078 GenericBuffer::get_occupancy ( uint ch ) const 00079 { 00080 return buffers[ch].size(); 00081 } /* ----- end of function GenericBuffer::get_occupancy ----- */ 00082 00083 void 00084 GenericBuffer::resize( uint v, uint bs ) 00085 { 00086 /* 00087 for ( uint i = vcs; i<buffers.size(); i++ ) 00088 while( !buffers[i].empty()) 00089 { 00090 delete buffers[i].front(); 00091 buffers[i].pop(); 00092 } 00093 * */ 00094 vcs =v; 00095 buffer_size = bs; 00096 buffers.resize(vcs); 00097 for( uint i=0; i<vcs; i++) 00098 { 00099 buffers[i].clear(); 00100 assert(buffers[i].size()<=buffer_size); 00101 } 00102 00103 return; 00104 } /* ----- end of function GenericBuffer::change_vcs ----- */ 00105 00106 uint 00107 GenericBuffer::get_no_vcs() const 00108 { 00109 /* should be return the pvt variable but for now using this to ensure 00110 * init was right and not accessing member variable. */ 00111 return buffers.size(); 00112 } 00113 00114 void 00115 GenericBuffer::change_pull_channel ( uint ch ) 00116 { 00117 assert(ch<vcs); 00118 pull_channel = ch; 00119 return; 00120 } /* ----- end of function GenericBuffer::change_pull_channel ----- */ 00121 00122 void 00123 GenericBuffer::change_push_channel ( uint ch ) 00124 { 00125 push_channel = ch; 00126 return; 00127 } /* ----- end of function GenericBuffer::change_pull_channel ----- */ 00128 00129 00130 uint 00131 GenericBuffer::get_pull_channel () const 00132 { 00133 return pull_channel; 00134 } /* ----- end of function GenericBuffer::get_pull_channel ----- */ 00135 00136 uint 00137 GenericBuffer::get_push_channel () const 00138 { 00139 return push_channel; 00140 } /* ----- end of function GenericBuffer::get_push_channel ----- */ 00141 00142 bool 00143 GenericBuffer::is_channel_full ( uint ch ) const 00144 { 00145 /* this is the buffer size that the router is configured for the implementation allow for a bigger buffer[i].size which is the simulation artifact and not the buffer size in the physical router */ 00146 return buffers[ch].size() > buffer_size; 00147 } /* ----- end of function GenericBuffer::full ----- */ 00148 00149 bool 00150 GenericBuffer::is_empty (uint ch ) const 00151 { 00152 return buffers[ch].empty(); 00153 } /* ----- end of function GenericBuffer::empty ----- */ 00154 00155 string 00156 GenericBuffer::toString () const 00157 { 00158 stringstream str; 00159 str << "GenericBuffer" 00160 << "\t buffer_size: " << buffer_size 00161 << "\t No of buffers: " << buffers.size() << "\n"; 00162 for( uint i=0; i<buffers.size() && !buffers[i].empty(); i++) 00163 str << buffers[i].front()->toString(); 00164 return str.str(); 00165 } /* ----- end of function GenericBuffer::toString ----- */ 00166 00167 #endif /* ----- #ifndef _genericbuffer_cc_INC ----- */ 00168