00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef SST_CORE_LINK_H
00013 #define SST_CORE_LINK_H
00014
00015 #include <sst/core/sst_types.h>
00016 #include <sst/core/serialization.h>
00017
00018 #include <sst/core/event.h>
00019
00020
00021 namespace SST {
00022
00023 #define _LINK_DBG( fmt, args...) __DBG( DBG_LINK, Link, fmt, ## args )
00024
00025 class TimeConverter;
00026 class LinkPair;
00027 class Simulation;
00028 class ActivityQueue;
00029 class SyncBase;
00030
00031 class UnitAlgebra;
00032
00033
00034 class Link {
00035 typedef enum { POLL, HANDLER, QUEUE } Type_t;
00036 public:
00037
00038 friend class LinkPair;
00039 friend class Simulation;
00040 friend class SyncBase;
00041
00042
00043 Link(LinkId_t id);
00044
00045 virtual ~Link();
00046
00047
00048 void setLatency(Cycle_t lat);
00049
00050
00051
00052
00053 void addRecvLatency(int cycles, std::string timebase);
00054
00055
00056
00057
00058 void addRecvLatency(SimTime_t cycles, TimeConverter* timebase);
00059
00060
00061 void setFunctor(Event::HandlerBase* functor) {
00062 rFunctor = functor;
00063 }
00064
00065
00066 void setPolling();
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void send( SimTime_t delay, TimeConverter* tc, Event* event );
00077
00078
00079
00080
00081
00082
00083
00084 inline void send( SimTime_t delay, Event* event ) {
00085 send(delay,defaultTimeBase,event);
00086 }
00087
00088
00089
00090
00091 inline void send( Event* event ) {
00092 send( 0, event );
00093 }
00094
00095
00096
00097
00098
00099
00100 Event* recv();
00101
00102
00103
00104
00105 void setDefaultTimeBase(TimeConverter* tc);
00106
00107 TimeConverter* getDefaultTimeBase();
00108
00109
00110 inline void deliverEvent(Event* event) {
00111 (*rFunctor)(event);
00112 }
00113
00114
00115 LinkId_t getId() { return id; }
00116
00117
00118 void sendInitData(Event* init_data);
00119
00120 Event* recvInitData();
00121
00122 #ifdef __SST_DEBUG_EVENT_TRACKING__
00123 void setSendingComponentInfo(const std::string& comp_in, const std::string& type_in, const std::string& port_in) {
00124 comp = comp_in;
00125 ctype = type_in;
00126 port = port_in;
00127 }
00128
00129 const std::string& getSendingComponentName() { return comp; }
00130 const std::string& getSendingComponentType() { return ctype; }
00131 const std::string& getSendingPort() { return port; }
00132
00133 #endif
00134
00135
00136
00137 protected:
00138 Link();
00139
00140
00141 ActivityQueue* recvQueue;
00142
00143 ActivityQueue* initQueue;
00144
00145 ActivityQueue* configuredQueue;
00146
00147 static ActivityQueue* uninitQueue;
00148
00149 static ActivityQueue* afterInitQueue;
00150
00151
00152
00153
00154 Event::HandlerBase* rFunctor;
00155
00156
00157
00158
00159
00160
00161 TimeConverter* defaultTimeBase;
00162
00163
00164
00165
00166
00167 SimTime_t latency;
00168
00169
00170 Link* pair_link;
00171
00172 private:
00173 Link( const Link& l );
00174
00175 void sendInitData_sync(Event* init_data);
00176 void finalizeConfiguration();
00177
00178 Type_t type;
00179 LinkId_t id;
00180
00181 #ifdef __SST_DEBUG_EVENT_TRACKING__
00182 std::string comp;
00183 std::string ctype;
00184 std::string port;
00185 #endif
00186
00187
00188
00189 friend class boost::serialization::access;
00190 template<class Archive>
00191 void serialize(Archive & ar, const unsigned int version );
00192 };
00193
00194
00195 class SelfLink : public Link {
00196 public:
00197 SelfLink() : Link()
00198 {
00199 pair_link = this;
00200 latency = 0;
00201 }
00202
00203 friend class boost::serialization::access;
00204
00205 template<class Archive>
00206 void serialize(Archive & ar, const unsigned int version );
00207 };
00208
00209
00210 }
00211
00212 BOOST_CLASS_EXPORT_KEY(SST::Link)
00213 BOOST_CLASS_EXPORT_KEY(SST::SelfLink)
00214
00215
00216 #endif // SST_CORE_LINK_H