00001 /* 00002 * ===================================================================================== 00003 * 00004 * Filename: flit.cc 00005 * 00006 * Description: 00007 * 00008 * Version: 1.0 00009 * Created: 02/22/2010 03:08:35 PM 00010 * Revision: none 00011 * Compiler: gcc 00012 * 00013 * Author: Mitchelle Rasquinha (), mitchelle.rasquinha@gatech.edu 00014 * Company: Georgia Institute of Technology 00015 * 00016 * ===================================================================================== 00017 */ 00018 00019 #ifndef _flit_cc_INC 00020 #define _flit_cc_INC 00021 00022 #include "flit.h" 00023 /* 00024 *-------------------------------------------------------------------------------------- 00025 * Class: Phit 00026 * Method: Phit 00027 * Description: constructor 00028 *-------------------------------------------------------------------------------------- 00029 */ 00030 Phit::Phit () 00031 { 00032 } /* ----- end of method Phit::Phit (constructor) ----- */ 00033 00034 Phit::~Phit() 00035 { 00036 data.clear(); 00037 } 00038 00039 string 00040 Phit::toString () const 00041 { 00042 stringstream str; 00043 str << "Phit: "; 00044 for( int i=data.size() ; i>0 ;i--) 00045 str << data[i-1]; 00046 00047 str << endl; 00048 return str.str(); 00049 } /* ----- end of function Phit::toString ----- */ 00050 00051 /* Flit Class Impl */ 00052 Flit::Flit() 00053 { 00054 is_single_flit_pkt = false; 00055 00056 } 00057 00058 void Flit::populate_phit_data(vector<bool>* data) 00059 { 00060 uint no_of_phits = (uint)(ceil((data->size() + 0.0)/max_phy_link_bits)); 00061 // phits.resize(no_of_phits); 00062 for ( uint i=0; i<no_of_phits; i++) 00063 phits.push_back( new Phit()); 00064 00065 for( uint i=0; i< no_of_phits; i++) 00066 { 00067 for ( uint j=0;j<max_phy_link_bits && (i*max_phy_link_bits + j)<data->size(); j++ ) 00068 phits[i]->data.push_back(data->at(i*max_phy_link_bits + j)); 00069 } 00070 } 00071 00072 Flit::~Flit() 00073 { 00074 /* 00075 for( uint i=0; i<phits.size(); i++) 00076 delete(phits.at(i)); 00077 * */ 00078 } 00079 00080 string Flit::toString() const 00081 { 00082 stringstream str; 00083 str << "Flit" 00084 << "\tFlit type: " << type 00085 << endl; 00086 00087 for ( uint i=0 ; i<phits.size() ; i++ ) 00088 str << phits[i]->toString(); 00089 00090 return str.str(); 00091 } 00092 00093 /* HeadFlit Class Impl */ 00094 HeadFlit::HeadFlit() 00095 { 00096 type = HEAD; 00097 src_address = -1; 00098 dst_address = -1; 00099 transaction_id = -1; 00100 pkt_cnt = 0; 00101 is_dateline_traversed = false; 00102 } 00103 00104 HeadFlit::~HeadFlit() 00105 { 00106 // phits.clear(); 00107 for( uint i=0; i<phits.size(); i++) 00108 delete(phits.at(i)); 00109 00110 control_bits.clear(); 00111 payload.clear(); 00112 } 00113 00114 string 00115 HeadFlit::toString() const 00116 { 00117 stringstream str; 00118 str << "HeadFlit" 00119 << "\tSrc: " << src_address/3 00120 << "\tDst: " << dst_address 00121 << "\tTran_id: " << transaction_id 00122 << "\t VC: " << vc 00123 << "\t length: " << length 00124 << "\t control_bits_size: " << control_bits.size() 00125 << "\t payload_size: " << payload.size() 00126 << "\thop_count : " << hop_count 00127 << "\tavg_net_latency : " << avg_network_latency 00128 << "\t msg_class: " << msg_class 00129 << "\t packetcount: " << pkt_cnt 00130 << "\t addr: " << hex << addr << dec 00131 << endl; 00132 00133 str << "Control bits: " ; 00134 for ( uint i=0 ; i<control_bits.size() ; i++ ) 00135 str << control_bits[i] << " "; 00136 str << endl; 00137 00138 for ( uint i=0 ; i<phits.size() ; i++ ) 00139 str << phits[i]->toString(); 00140 00141 return str.str(); 00142 } 00143 00144 void 00145 HeadFlit::populate_head_flit() 00146 { 00147 vector<bool> data; 00148 for ( uint i=0; i<max_network_node_bits ; i++ ) 00149 data.push_back((src_address >> i)&0x01); 00150 00151 for ( uint i=0; i<max_network_node_bits ; i++ ) 00152 data.push_back((dst_address >> i)&0x01); 00153 00154 for ( uint i=0; i<max_transaction_id_bits ; i++ ) 00155 data.push_back((transaction_id >> i)&0x01); 00156 00157 for ( uint i=0; i<max_pkt_cnt_bits ; i++ ) 00158 data.push_back((pkt_cnt >> i)&0x01); 00159 00160 for ( uint i=0; i<control_bits.size() ; i++ ) 00161 data.push_back(control_bits[i]); 00162 00163 for ( uint i=0; i<payload.size() ; i++ ) 00164 data.push_back(payload[i]); 00165 00166 populate_phit_data(&data); 00167 return; 00168 } 00169 00170 /* BodyFlit Class Impl */ 00171 BodyFlit::BodyFlit() 00172 { 00173 type = BODY; 00174 } 00175 00176 BodyFlit::~BodyFlit() 00177 { 00178 // phits.clear(); 00179 for( uint i=0; i<phits.size(); i++) 00180 delete(phits.at(i)); 00181 } 00182 00183 TailFlit::~TailFlit() 00184 { 00185 // phits.clear(); 00186 for( uint i=0; i<phits.size(); i++) 00187 delete(phits.at(i)); 00188 } 00189 00190 string BodyFlit::toString() const 00191 { 00192 stringstream str; 00193 str << "BodyFlit" 00194 << "\tFlit type: " << type 00195 << endl; 00196 00197 for ( uint i=0 ; i<phits.size() ; i++ ) 00198 str << phits[i]->toString(); 00199 00200 return str.str(); 00201 } 00202 00203 void 00204 BodyFlit::populate_body_flit() 00205 { 00206 /* Assumption: 1 body flit = 1phit */ 00207 populate_phit_data(&bf_data); 00208 00209 return ; 00210 } 00211 00212 /* TailFlit Class Impl */ 00213 TailFlit::TailFlit() 00214 { 00215 type = TAIL; 00216 packet_originated_time = (ullint)Simulator::Now(); 00217 } 00218 00219 string TailFlit::toString() const 00220 { 00221 stringstream str; 00222 str << "TailFlit" 00223 << "\tFlit type: " << type 00224 << "\tpacket_originated_time: " << packet_originated_time 00225 << "\thop_count : " << hop_count 00226 << "\tavg_net_latency : " << avg_network_latency 00227 << endl; 00228 00229 for ( uint i=0 ; i<phits.size() ; i++ ) 00230 str << phits[i]->toString(); 00231 00232 return str.str(); 00233 } 00234 00235 void 00236 TailFlit::populate_tail_flit () 00237 { 00238 vector<bool> data; 00239 for ( uint i=0; i<max_tail_length_bits; i++ ) 00240 data.push_back((packet_originated_time >> i)&0x01); 00241 00242 populate_phit_data(&data); 00243 return; 00244 } /* ----- end of function TailFlit::populate_tail_flit ----- */ 00245 00246 #endif /* ----- #ifndef _flit_cc_INC ----- */ 00247