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