flit.cc

Go to the documentation of this file.
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 

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