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
00037 #ifndef RC_ABSTRACT_INTERFACE_WRAPPER_H_
00038 #define RC_ABSTRACT_INTERFACE_WRAPPER_H_
00039
00040 #include "ReChannel/communication/rc_interface_wrapper.h"
00041 #include "ReChannel/communication/rc_fallback_interface.h"
00042 #include "ReChannel/communication/rc_report_ids.h"
00043
00044 #ifndef RC_INTERFACE_WRAPPER_MAX_DRIVER_COUNT
00045 #define RC_INTERFACE_WRAPPER_MAX_DRIVER_COUNT 32
00046 #endif
00047
00048 namespace ReChannel {
00049
00050 template<class IF> class rc_abstract_interface_wrapper;
00051
00055 class rc_abstract_interface_wrapper_b
00056 : virtual public rc_interface_wrapper_base,
00057 virtual protected rc_event_forwarder_host
00058 {
00059 template<class IF> friend class rc_abstract_interface_wrapper;
00060
00061 private:
00062 typedef std::vector<void*> vector;
00063 typedef std::vector<std::string> string_vector;
00064 typedef std::map<std::string, rc_event_forwarder_base*>
00065 event_forwarder_base_map;
00066 typedef std::vector<rc_event_forwarder_base*> ef_vector;
00067 typedef std::pair<rc_event_forwarder_base*, ef_vector>
00068 event_ef_map_entry;
00069 typedef std::map<const sc_event*, event_ef_map_entry> event_ef_map;
00070
00071 private:
00072 explicit rc_abstract_interface_wrapper_b(void* if_);
00073
00074 public:
00075
00076 virtual std::string get_interface_wrapper_name() const
00077 { return "(unknown)"; }
00078
00079 virtual rc_event_forwarder_host* get_event_forwarder_host()
00080 { return static_cast<rc_event_forwarder_host*>(this); }
00081
00082 protected:
00083
00085 virtual void add_event_forwarder(
00086 rc_event_forwarder_base& forwarder, const sc_event& e,
00087 const std::string& event_name=NULL);
00088
00090 virtual void add_event_forwarder_target(
00091 sc_interface& if_, rc_event_filter* filter=NULL);
00092
00094 virtual bool add_event_forwarder_target(
00095 const std::string& event_name, sc_interface& if_,
00096 rc_event_filter* filter=NULL);
00097
00099 virtual bool get_event_forwarder_target_count() const
00100 { return p_event_forwarder_base_map.size(); }
00101
00103 virtual void clear_event_forwarder_targets();
00104
00106 virtual void clear_event_forwarder_targets(
00107 const std::string& event_name);
00108
00110 virtual string_vector get_event_forwarder_names() const;
00111
00113 virtual void notify_event(const std::string& event_name);
00114
00115 virtual void register_port(
00116 sc_port_base& port_, const char* if_typename)
00117 { this->get_wrapped_interface().register_port(port_, if_typename); }
00118
00119 virtual rc_process_behavior_change begin_access_callback()
00120 { return rc_process_behavior_change(); }
00121
00122 virtual void end_access_callback() { };
00123
00124 inline int get_driver_count() const
00125 { return p_drv_obj_vector.size(); }
00126
00127 inline int get_nb_driver_count() const
00128 { return p_nb_drv_obj_vector.size(); }
00129
00130 virtual ~rc_abstract_interface_wrapper_b();
00131
00132 private:
00133
00134 inline void* get_wrapped_if() const
00135 { return p_interface; }
00136
00137 void set_wrapped_if(void* if_);
00138
00140 void* find_driver_object(int index);
00141
00143 inline void* find_nb_driver_object(int index);
00144
00145 void* create_driver_object(int index);
00146
00147 void* create_nb_driver_object(int index);
00148
00149 void delete_all_drivers();
00150
00151 void delete_all_event_forwarders();
00152
00153 void missing_fallback_if_error() const;
00154
00155 private:
00156
00157
00158
00159 rc_event_forwarder_base& _rc_get_event_forwarder(
00160 const std::string& event_name);
00161
00163 void _rc_spawn_event_forwarder_process(
00164 rc_event_forwarder_base& forwarder, const sc_event& e);
00165
00167 static void _rc_event_forwarder_proc(
00168 event_ef_map_entry& map_entry);
00169
00170
00171
00172 virtual void* _rc_create_driver_object(void* if_) const = 0;
00173
00174 virtual void* _rc_create_nb_driver_object(void* if_) const = 0;
00175
00176 virtual void _rc_set_driver_channel(
00177 void* drv_obj, void* if_) const = 0;
00178
00179 virtual void _rc_set_nb_driver_channel(
00180 void* nb_drv_obj, void* if_) const = 0;
00181
00182 virtual void _rc_delete_driver_object(void* drv_obj) const = 0;
00183
00184 virtual void _rc_delete_nb_driver_object(void* nb_drv_obj) const = 0;
00185
00186 private:
00187
00189 event_forwarder_base_map p_event_forwarder_base_map;
00190
00191 private:
00192
00194 static event_ef_map s_event_ef_map;
00195
00196 private:
00197
00198
00199
00200 void* p_interface;
00201 vector p_drv_obj_vector;
00202 vector p_nb_drv_obj_vector;
00203
00204 private:
00205
00206 rc_abstract_interface_wrapper_b(
00207 const rc_abstract_interface_wrapper_b& orig) { }
00208 rc_abstract_interface_wrapper_b& operator=(
00209 const rc_abstract_interface_wrapper_b& orig);
00210 };
00211
00215 template<class IF>
00216 class rc_abstract_interface_wrapper
00217 : public rc_abstract_interface_wrapper_b,
00218 virtual public rc_interface_wrapper<IF>
00219 {
00220 RC_STATIC_ASSERT_VALID_INTERFACE(IF);
00221
00222 private:
00223 typedef rc_abstract_interface_wrapper_b base_type;
00224 typedef rc_driver_object<IF> drv_obj_type;
00225 typedef rc_nb_driver_object<IF> nb_drv_obj_type;
00226
00227 protected:
00228 typedef typename rc_interface_wrapper<IF>::interface_access
00229 interface_access;
00230 typedef typename rc_interface_wrapper<IF>::nb_interface_access
00231 nb_interface_access;
00232 typedef typename rc_interface_wrapper<IF>::driver_access
00233 driver_access;
00234 typedef typename rc_interface_wrapper<IF>::nb_driver_access
00235 nb_driver_access;
00236
00237 public:
00238 typedef rc_interface_wrapper<IF> interface_wrapper_type;
00239 typedef typename rc_interface_wrapper<IF>::accessor accessor_type;
00240
00241 protected:
00242 rc_abstract_interface_wrapper();
00243
00244 explicit rc_abstract_interface_wrapper(IF& if_);
00245
00246 public:
00247
00248 virtual interface_access get_interface_access()
00249 { return interface_access(*this); }
00250
00251 virtual nb_interface_access get_nb_interface_access()
00252 { return nb_interface_access(*this); }
00253
00254 virtual driver_access get_driver_access(int driver_index)
00255 { return driver_access(*this, driver_index); }
00256
00257 virtual nb_driver_access get_nb_driver_access(int driver_index)
00258 { return nb_driver_access(*this, driver_index); }
00259
00260 virtual int get_driver_count() const
00261 { return base_type::get_driver_count(); }
00262
00263 virtual int get_nb_driver_count() const
00264 { return base_type::get_nb_driver_count(); }
00265
00266 inline virtual sc_interface& get_wrapped_interface() const
00267 { return this->get_wrapped_if(); }
00268
00269 protected:
00270
00271 inline IF& get_wrapped_if() const
00272 { return *(reinterpret_cast<IF*>(base_type::get_wrapped_if())); }
00273
00274 virtual bool set_wrapped_interface(sc_interface& if_);
00275
00276 inline virtual bool set_wrapped_interface(IF& if_)
00277 { base_type::set_wrapped_if(&if_); return true; }
00278
00279 virtual IF& rc_get_fallback_if() const;
00280
00281 virtual IF* nb_interface_access_callback()
00282 { return reinterpret_cast<IF*>(base_type::get_wrapped_if()); }
00283
00284 virtual IF* interface_access_callback()
00285 { return reinterpret_cast<IF*>(base_type::get_wrapped_if()); }
00286
00287 virtual typename rc_nb_driver_object<IF>::driver_access*
00288 nb_driver_access_callback(int driver_index)
00289 { return &(this->get_nb_driver_object(driver_index).access); }
00290
00291 virtual typename rc_driver_object<IF>::driver_access*
00292 driver_access_callback(int driver_index)
00293 { return &(this->get_driver_object(driver_index).access); }
00294
00296 inline rc_driver_object<IF>& get_driver_object(int index);
00297
00299 inline rc_nb_driver_object<IF>& get_nb_driver_object(int index);
00300
00302 rc_event_forwarder<IF>& add_event_forwarder(
00303 const sc_event& source_event,
00304 boost::function<const sc_event& (IF*)> event_getter,
00305 const std::string& event_name=NULL);
00306
00308 rc_event_forwarder<IF>& add_event_forwarder(
00309 IF& trigger_if,
00310 boost::function<const sc_event& (IF*)> event_getter,
00311 const std::string& event_name=NULL);
00312
00313 virtual ~rc_abstract_interface_wrapper();
00314
00315 private:
00316
00317
00318
00319 virtual void* _rc_create_driver_object(void* if_) const;
00320
00321 virtual void* _rc_create_nb_driver_object(void* if_) const;
00322
00323 virtual void _rc_set_driver_channel(void* drv_obj, void* if_) const;
00324
00325 virtual void _rc_set_nb_driver_channel(void* nb_drv_obj, void* if_) const;
00326
00327 virtual void _rc_delete_driver_object(void* drv_obj) const;
00328
00329 virtual void _rc_delete_nb_driver_object(void* nb_drv_obj) const;
00330 };
00331
00332
00333
00334 inline
00335 void* rc_abstract_interface_wrapper_b::find_driver_object(int index)
00336 {
00337 int size = (int)p_drv_obj_vector.size();
00338 if (size > 0 && index >= 0 && index < size) {
00339 return p_drv_obj_vector[index];
00340 } else {
00341 return NULL;
00342 }
00343 }
00344
00345 inline
00346 void* rc_abstract_interface_wrapper_b::find_nb_driver_object(int index)
00347 {
00348 int size = (int)p_nb_drv_obj_vector.size();
00349 if (size > 0 && index >= 0 && index < size) {
00350 return p_nb_drv_obj_vector[index];
00351 } else {
00352 return NULL;
00353 }
00354 }
00355
00356
00357
00358 template<class IF>
00359 rc_abstract_interface_wrapper<IF>::rc_abstract_interface_wrapper()
00360 : base_type(&rc_get_fallback_if())
00361 { }
00362
00363 template<class IF>
00364 rc_abstract_interface_wrapper<IF>::rc_abstract_interface_wrapper(
00365 IF& if_)
00366 : base_type(&if_)
00367 { }
00368
00369 template<class IF>
00370 rc_abstract_interface_wrapper<IF>::~rc_abstract_interface_wrapper()
00371 {
00372 this->delete_all_drivers();
00373 this->delete_all_event_forwarders();
00374 }
00375
00376 template<class IF>
00377 rc_event_forwarder<IF>&
00378 rc_abstract_interface_wrapper<IF>::add_event_forwarder(
00379 const sc_event& source_event,
00380 boost::function<const sc_event& (IF*)> event_getter,
00381 const std::string& event_name)
00382 {
00383 std::auto_ptr<rc_event_forwarder<IF> > forwarder(
00384 new rc_event_forwarder<IF>(event_getter));
00385 base_type::add_event_forwarder(
00386 *forwarder, source_event, event_name);
00387 return *(forwarder.release());
00388 }
00389
00390 template<class IF>
00391 rc_event_forwarder<IF>&
00392 rc_abstract_interface_wrapper<IF>::add_event_forwarder(
00393 IF& trigger_if,
00394 boost::function<const sc_event& (IF*)> event_getter,
00395 const std::string& event_name)
00396 {
00397 const sc_event& source_event = event_getter(&trigger_if);
00398 return this->add_event_forwarder(
00399 source_event, event_getter, event_name);
00400 }
00401
00402 template<class IF>
00403 bool rc_abstract_interface_wrapper<IF>::set_wrapped_interface(
00404 sc_interface& if_)
00405 {
00406 IF* if__ = dynamic_cast<IF*>(&if_);
00407 if (if__ == NULL) {
00408 return false;
00409 } else {
00410 base_type::set_wrapped_if(if__);
00411 return true;
00412 }
00413 }
00414
00415 template<class IF>
00416 IF& rc_abstract_interface_wrapper<IF>::rc_get_fallback_if() const
00417 {
00418 static IF* s_fallback_if =
00419 rc_fallback_interface_factory<IF>::create();
00420
00421 if (s_fallback_if != NULL) {
00422 return *s_fallback_if;
00423 } else {
00424 base_type::missing_fallback_if_error();
00425 throw 0;
00426 }
00427 }
00428
00429 template<class IF>
00430 inline
00431 rc_driver_object<IF>&
00432 rc_abstract_interface_wrapper<IF>::get_driver_object(int index)
00433 {
00434 void* drv = base_type::find_driver_object(index);
00435 if (drv == NULL) {
00436 drv = base_type::create_driver_object(index);
00437 }
00438 return *(reinterpret_cast<drv_obj_type*>(drv));
00439 }
00440
00441 template<class IF>
00442 inline
00443 rc_nb_driver_object<IF>&
00444 rc_abstract_interface_wrapper<IF>::get_nb_driver_object(int index)
00445 {
00446 void* drv = base_type::find_nb_driver_object(index);
00447 if (drv == NULL) {
00448 drv = base_type::create_nb_driver_object(index);
00449 }
00450 return *(reinterpret_cast<nb_drv_obj_type*>(drv));
00451 }
00452
00453 template<class IF>
00454 void* rc_abstract_interface_wrapper<IF>::_rc_create_driver_object(
00455 void* if_) const
00456 {
00457 IF* if__ = reinterpret_cast<IF*>(if_);
00458 return new drv_obj_type(*if__);
00459 }
00460
00461 template<class IF>
00462 void* rc_abstract_interface_wrapper<IF>::_rc_create_nb_driver_object(
00463 void* if_) const
00464 {
00465 IF* if__ = reinterpret_cast<IF*>(if_);
00466 return new nb_drv_obj_type(*if__);
00467 }
00468
00469 template<class IF>
00470 void rc_abstract_interface_wrapper<IF>::_rc_set_driver_channel(
00471 void* drv_obj, void* if_) const
00472 {
00473 IF* if__ = reinterpret_cast<IF*>(if_);
00474 drv_obj_type* drv_obj__ = reinterpret_cast<drv_obj_type*>(drv_obj);
00475 drv_obj__->set_channel(*if__);
00476 }
00477
00478 template<class IF>
00479 void rc_abstract_interface_wrapper<IF>::_rc_set_nb_driver_channel(
00480 void* nb_drv_obj, void* if_) const
00481 {
00482 IF* if__ = reinterpret_cast<IF*>(if_);
00483 nb_drv_obj_type* nb_drv_obj__ =
00484 reinterpret_cast<nb_drv_obj_type*>(nb_drv_obj);
00485 nb_drv_obj__->set_channel(*if__);
00486 }
00487
00488 template<class IF>
00489 void rc_abstract_interface_wrapper<IF>::_rc_delete_driver_object(
00490 void* drv_obj) const
00491 {
00492 drv_obj_type* drv_obj__ =
00493 reinterpret_cast<drv_obj_type*>(drv_obj);
00494 delete drv_obj__;
00495 }
00496
00497 template<class IF>
00498 void rc_abstract_interface_wrapper<IF>::_rc_delete_nb_driver_object(
00499 void* nb_drv_obj) const
00500 {
00501 nb_drv_obj_type* nb_drv_obj__ =
00502 reinterpret_cast<nb_drv_obj_type*>(nb_drv_obj);
00503 delete nb_drv_obj__;
00504 }
00505
00506 }
00507
00508 #endif // RC_ABSTRACT_SWITCH_H_
00509
00510
00511
00512
00513