00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _ROUTERMODEL_H
00014 #define _ROUTERMODEL_H
00015
00016 #include <string.h>
00017 #include <sst/core/eventFunctor.h>
00018 #include <sst/core/component.h>
00019 #include <sst/core/link.h>
00020
00021 using namespace SST;
00022
00023 #define DBG_ROUTER_MODEL 1
00024 #if DBG_ROUTER_MODEL
00025 #define _ROUTER_MODEL_DBG(lvl, fmt, args...)\
00026 if (router_model_debug >= lvl) { \
00027 printf("%d:Routermodel::%s():%d: " fmt, _debug_rank, __FUNCTION__, __LINE__, ## args); \
00028 }
00029 #else
00030 #define _ROUTER_MODEL_DBG(lvl, fmt, args...)
00031 #endif
00032
00033 extern int router_model_debug;
00034
00035 #define MAX_LINK_NAME (16)
00036
00037
00038 class Routermodel : public Component {
00039 public:
00040 Routermodel(ComponentId_t id, Params_t& params) :
00041 Component(id),
00042 params(params)
00043 {
00044
00045 Params_t::iterator it= params.begin();
00046
00047 router_model_debug= 0;
00048 num_ports= -1;
00049
00050 while (it != params.end()) {
00051 _ROUTER_MODEL_DBG(1, "Router %s: key=%s value=%s\n", component_name.c_str(),
00052 it->first.c_str(), it->second.c_str());
00053
00054 if (!it->first.compare("debug")) {
00055 sscanf(it->second.c_str(), "%d", &router_model_debug);
00056 }
00057
00058 if (!it->first.compare("hop_delay")) {
00059 sscanf(it->second.c_str(), "%ld", &hop_delay);
00060 }
00061
00062 if (!it->first.compare("component_name")) {
00063 component_name= it->second;
00064 _ROUTER_MODEL_DBG(1, "Component name for ID %lu is \"%s\"\n", id, component_name.c_str());
00065 }
00066
00067 if (!it->first.compare("num_ports")) {
00068 sscanf(it->second.c_str(), "%d", &num_ports);
00069 }
00070
00071 ++it;
00072 }
00073
00074
00075 if (num_ports < 1) {
00076 _abort(Routermodel, "Need to define the num_ports parameter!\n");
00077 }
00078
00079
00080 for (int i= 0; i < num_ports; i++) {
00081 sprintf(link_name, "Link%dname", i);
00082 it= params.begin();
00083 while (it != params.end()) {
00084 if (!it->first.compare(link_name)) {
00085 break;
00086 }
00087 it++;
00088 }
00089
00090 if (it != params.end()) {
00091 strcpy(new_port.link_name, it->second.c_str());
00092 new_port.link= Routermodel::initPort(i, new_port.link_name);
00093 new_port.cnt_in= 0;
00094 new_port.cnt_out= 0;
00095 port.push_back(new_port);
00096 _ROUTER_MODEL_DBG(2, "Added handler for port %d, link \"%s\", on router %s\n",
00097 i, new_port.link_name, component_name.c_str());
00098 } else {
00099
00100 strcpy(new_port.link_name, "Unused_port");
00101 new_port.link= NULL;
00102 new_port.cnt_in= 0;
00103 new_port.cnt_out= 0;
00104 port.push_back(new_port);
00105 _ROUTER_MODEL_DBG(2, "Recorded unused port %d, link \"%s\", on router %s\n",
00106 i, new_port.link_name, component_name.c_str());
00107 }
00108 }
00109
00110 _ROUTER_MODEL_DBG(1, "Router model component \"%s\" is on rank %d\n",
00111 component_name.c_str(), _debug_rank);
00112
00113
00114 tc= registerTimeBase("1ns", true);
00115 }
00116
00117 private:
00118
00119 Routermodel(const Routermodel &c);
00120 bool handle_port_events(Event *, int in_port);
00121 Link *initPort(int port, char *link_name);
00122 EventHandler_t *RouterPortHandler;
00123
00124 Params_t params;
00125
00126 TimeConverter *tc;
00127 SimTime_t hop_delay;
00128 std::string component_name;
00129
00130 char link_name[MAX_LINK_NAME];
00131
00132 typedef struct port_t {
00133 char link_name[MAX_LINK_NAME];
00134 Link *link;
00135 long long int cnt_in;
00136 long long int cnt_out;
00137 } port_t;
00138 std::vector<port_t> port;
00139 std::vector<port_t>::iterator portNum;
00140 port_t new_port;
00141 int num_ports;
00142
00143 typedef struct router_t {
00144 int Id;
00145
00146 } router_t;
00147 std::vector<router_t> routers;
00148
00149 friend class boost::serialization::access;
00150 template<class Archive>
00151 void serialize(Archive & ar, const unsigned int version )
00152 {
00153 boost::serialization::base_object<Component>(*this);
00154 ar & BOOST_SERIALIZATION_NVP(params);
00155
00156 ar & BOOST_SERIALIZATION_NVP(tc);
00157 }
00158
00159 template<class Archive>
00160 friend void save_construct_data(Archive & ar,
00161 const Routermodel * t,
00162 const unsigned int file_version)
00163 {
00164 _AR_DBG(Routermodel,"\n");
00165 ComponentId_t id = t->_id;
00166 Params_t params = t->params;
00167 ar << BOOST_SERIALIZATION_NVP(id);
00168 ar << BOOST_SERIALIZATION_NVP(params);
00169 }
00170
00171 template<class Archive>
00172 friend void load_construct_data(Archive & ar,
00173 Routermodel * t,
00174 const unsigned int file_version)
00175 {
00176 _AR_DBG(Routermodel,"\n");
00177 ComponentId_t id;
00178 Params_t params;
00179 ar >> BOOST_SERIALIZATION_NVP(id);
00180 ar >> BOOST_SERIALIZATION_NVP(params);
00181 ::new(t)Routermodel(id, params);
00182 }
00183 };
00184
00185 #endif