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 #ifndef __NETWORK_H
00026 #define __NETWORK_H
00027
00028
00029
00030
00031 #include <vector>
00032 #include <fstream>
00033
00034 #include <sst/core/component.h>
00035 #include <sst/core/event.h>
00036 #include <sst_stdint.h>
00037
00038
00039 using namespace SST;
00040 typedef uint32_t uint32;
00041 typedef unsigned int uint;
00042
00043 const uint32 HDR_SIZE = 8/sizeof(int);
00044 const uint32 PKT_SIZE = 64/sizeof(int);
00045
00046 const int MaxPacketSize = HDR_SIZE + PKT_SIZE;
00047
00048 using namespace std;
00049
00050 #define NIC_VC_0 0
00051 #define NIC_VC_1 2
00052
00053 #define NIC_2_RTR_VC(vcc) ( vcc == 0 ? NIC_VC_0 : NIC_VC_1 )
00054 #define RTR_2_NIC_VC(vcc) ( vcc/2 )
00055
00056 #define LINK_TX 0
00057 #define LINK_RX 1
00058
00059 #define ROUTER_NUM_LINKS 6
00060 #define ROUTER_NUM_VCS 4
00061
00062 #define ROUTER_HOST_OUTQS 1
00063 #define ROUTER_HOST_INQS 1
00064 #define ROUTER_HOST_PORT 6
00065
00066 #define ROUTER_NUM_OUTQS (ROUTER_NUM_LINKS + ROUTER_HOST_OUTQS)
00067 #define ROUTER_NUM_INQS (ROUTER_NUM_LINKS + ROUTER_HOST_INQS)
00068
00069 #define DIST_POS(A,B,dimSize) (A < B) ? B - A : dimSize - (A - B)
00070 #define DIST_NEG(A,B,dimSize) (A < B) ? dimSize - ( B - A ) : A - B
00071
00072 #define LINK_VC0 0
00073 #define LINK_VC1 1
00074 #define LINK_VC2 2
00075 #define LINK_VC3 3
00076 #define LINK_CTRL_NUL 4
00077
00078 #define LINK_NUL_STATE 0
00079 #define LINK_CTRL_SENT 1
00080 #define LINK_ACK_SENT 2
00081 #define LINK_DATA_SENT 3
00082
00083 #define LINK_POS_X 0
00084 #define LINK_NEG_X 1
00085 #define LINK_POS_Y 2
00086 #define LINK_NEG_Y 3
00087 #define LINK_POS_Z 4
00088 #define LINK_NEG_Z 5
00089
00090 extern const char* LinkNames[];
00091
00092 #define REVERSE_DIR(dir, opp) switch (dir) { \
00093 case LINK_POS_X: opp = LINK_NEG_X; break; \
00094 case LINK_POS_Y: opp = LINK_NEG_Y; break; \
00095 case LINK_POS_Z: opp = LINK_NEG_Z; break; \
00096 case LINK_NEG_X: opp = LINK_POS_X; break; \
00097 case LINK_NEG_Y: opp = LINK_POS_Y; break; \
00098 case LINK_NEG_Z: opp = LINK_POS_Z; break; }
00099
00100
00101 static inline uint32 CalcNumFlits( int nwords ) {
00102 int numFlits = nwords % 2 ? nwords+1 : nwords;
00103 numFlits >>= 1;
00104 return numFlits;
00105 }
00106
00107 class Network {
00108 int _xDimSize, _yDimSize, _zDimSize;
00109 int _size;
00110
00111 public:
00112 Network( Component::Params_t );
00113 int xDimSize () {
00114 return _xDimSize;
00115 }
00116 int yDimSize () {
00117 return _yDimSize;
00118 }
00119 int zDimSize () {
00120 return _zDimSize;
00121 }
00122 int size() {
00123 return _size;
00124 }
00125 };
00126
00127
00128
00129
00130
00131 class networkFlit {
00132 enum flit_t { HEAD, BODY, NUL};
00133 flit_t flitType;
00134 static const int size=8;
00135 };
00136
00137
00138
00139 class networkPacket {
00140
00141 int _destNum;
00142 int _sourceNum;
00143 uint _sizeInFlits;
00144 int _vc;
00145 int _link;
00146
00147
00148 public:
00149 int &vc () {
00150 return _vc;
00151 }
00152 int &link () {
00153 return _link;
00154 }
00155
00156 int &srcNum() {
00157 return _sourceNum;
00158 }
00159 int srcNum() const {
00160 return _sourceNum;
00161 }
00162 int &destNum() {
00163 return _destNum;
00164 }
00165 int destNum() const {
00166 return _destNum;
00167 }
00168
00169 uint &sizeInFlits() {
00170 return _sizeInFlits;
00171 }
00172 uint sizeInFlits() const {
00173 return _sizeInFlits;
00174 }
00175
00176 uint32 payload[HDR_SIZE+PKT_SIZE];
00177
00178 private:
00179 friend class boost::serialization::access;
00180 template<class Archive>
00181 void
00182 serialize(Archive & ar, const unsigned int version )
00183 {
00184 ar & BOOST_SERIALIZATION_NVP(_destNum);
00185 ar & BOOST_SERIALIZATION_NVP(_sourceNum);
00186 ar & BOOST_SERIALIZATION_NVP(_sizeInFlits);
00187 ar & BOOST_SERIALIZATION_NVP(_vc);
00188 ar & BOOST_SERIALIZATION_NVP(_link);
00189 ar & BOOST_SERIALIZATION_NVP(payload);
00190 }
00191 };
00192
00193 class RtrEvent : public Event {
00194 public:
00195 typedef enum { Credit, Packet } msgType_t;
00196
00197 int type;
00198 networkPacket packet;
00199 struct Credit {
00200 uint32_t num;
00201 int vc;
00202
00203 friend class boost::serialization::access;
00204 template<class Archive>
00205 void
00206 serialize(Archive & ar, const unsigned int version )
00207 {
00208 ar & BOOST_SERIALIZATION_NVP(num);
00209 ar & BOOST_SERIALIZATION_NVP(vc);
00210 }
00211 } credit;
00212
00213 private:
00214 friend class boost::serialization::access;
00215 template<class Archive>
00216 void
00217 serialize(Archive & ar, const unsigned int version )
00218 {
00219 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Event);
00220 ar & BOOST_SERIALIZATION_NVP(type);
00221 ar & BOOST_SERIALIZATION_NVP(credit);
00222 ar & BOOST_SERIALIZATION_NVP(packet);
00223 }
00224 };
00225
00226 #endif