• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

sst/elements/SS_router/SS_router/SS_network.h

00001 // Copyright 2009-2010 Sandia Corporation. Under the terms
00002 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
00003 // Government retains certain rights in this software.
00004 // 
00005 // Copyright (c) 2009-2010, Sandia Corporation
00006 // All rights reserved.
00007 // 
00008 // This file is part of the SST software package. For license
00009 // information, see the LICENSE file in the top level directory of the
00010 // distribution.
00011 
00012 
00013 // Copyright 2007 Sandia Corporation. Under the terms
00014 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
00015 // Government retains certain rights in this software.
00016 //
00017 // Copyright (c) 2007, Sandia Corporation
00018 // All rights reserved.
00019 //
00020 // This file is part of the SST software package. For license
00021 // information, see the LICENSE file in the top level directory of the
00022 // distribution.
00023 
00024 
00025 #ifndef __NETWORK_H
00026 #define __NETWORK_H
00027 
00028 
00029 //test-router
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; // adjust for flits
00103     numFlits >>= 1;                                // words to flits
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 //: Network Flit
00129 //
00130 //!SEC:EDSim
00131 class networkFlit {
00132     enum flit_t { HEAD, BODY, NUL};
00133     flit_t flitType;
00134     static const int size=8;     //8 bytes
00135 };
00136 //: Network Packet
00137 //
00138 //!SEC:EDSim
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

Generated on Fri Oct 22 2010 11:02:28 for SST by  doxygen 1.7.1