Changeset 52 for sources/src/sc_port_ext.h
- Timestamp:
- Jan 22, 2013, 4:23:22 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sources/src/sc_port_ext.h
r47 r52 11 11 | | 12 12 \------------------------------------------------------------*/ 13 13 14 #ifndef __SC_PORT_EXT_H__ 14 15 #define __SC_PORT_EXT_H__ … … 36 37 // 37 38 #if ((__GNUC__ < 3) || (__GNUC_MINOR__ < 4)) 38 #define INLINE __attribute__((always_inline))39 #define INLINE __attribute__((always_inline)) 39 40 #else 40 /* gcc3.4 doesn't support */41 #define INLINE41 /* gcc3.4 doesn't support */ 42 #define INLINE 42 43 #endif 43 44 44 45 #include <list> 45 46 46 // 47 47 48 namespace sc_core { 48 // 49 50 using namespace sc_dt; 51 52 const char *get_name (const tab_t *pointer); 49 50 using namespace sc_dt; 51 52 const char * get_name(const tab_t * pointer); 53 53 54 54 #define READ_SIGNAL(value_type_,pointer_) \ 55 55 ((value_type_&) (*((value_type_*) (pointer_)))) 56 56 57 57 58 ///////////////////// DEPRECATED 58 59 // C ANSI-only since it is needed to link with extern "C" 59 60 60 extern void bind (sc_port_base&,sc_port_base&); 61 extern void bind (sc_port_base&,sc_signal_base&); 62 extern void bind (sc_signal_base &x); 63 extern void bind (sc_port_base &x); 61 62 extern void bind(sc_port_base &, sc_port_base&); 63 extern void bind(sc_port_base &, sc_signal_base&); 64 extern void bind(sc_signal_base & x); 65 extern void bind(sc_port_base & x); 64 66 65 67 // KIND STRING … … 68 70 extern const char * const sc_out_string; 69 71 70 extern "C" void update (void); 71 72 class sc_port_base : public sc_object, public sc_interface 72 extern "C" void update(void); 73 74 class sc_port_base : public sc_object, public sc_interface { 75 76 protected: 77 typedef sc_port_base base_type; 78 79 public: 80 /////////// 81 // Internal 82 const sc_module & get_module() const; 83 void init(); 84 void check_multiwriting2port() const; 85 /////////// 86 87 friend std::ostream & operator << (std::ostream &, const sc_port_base &); 88 89 90 // LRM 91 static const char * const kind_string; 92 // 93 94 sc_port_base(); 95 sc_port_base(const char * name_); 96 explicit sc_port_base(const sc_port_base & parent_); 97 /*virtual */~sc_port_base() {}; 98 // bind to a handle 99 void operator () (method_process_t & func) const; 100 }; 101 102 103 template < typename T > class sc_port_b : public sc_port_base 73 104 { 74 protected: 75 typedef sc_port_base base_type; 76 public: 105 }; 106 107 108 // ---------------------------------------------------------------------------- 109 // CLASS : sc_in< T > 110 // 111 // ---------------------------------------------------------------------------- 112 113 template < typename T > 114 class sc_in : public sc_port_base { 115 116 private: 117 typedef T data_type; 118 typedef sc_port_base base_type; 119 typedef sc_in<data_type> this_type; 120 typedef sc_signal<data_type> signal_type; 121 122 123 /////////// 124 // Internal 125 void init(); 126 /////////// 127 128 public: 129 // constructors 130 sc_in() : base_type() { init(); } 131 132 explicit sc_in(const char * name_) : base_type(name_) { init(); } 133 134 explicit sc_in(const base_type & parent_) : base_type( parent_ ) { init(); } 135 136 /* 137 // LRM error ! 138 //static const char *const kind_string; this is a template ! 139 */ 140 // virtual const char *kind () const 141 // { return "sc_in"; }; 142 143 sc_event neg() const { return sc_event(*this, sc_event::NEG); }; 144 sc_event pos() const { return sc_event(*this, sc_event::POS); }; 145 146 // read the current value 147 inline const T & read() const INLINE; 148 inline operator const T & () const INLINE; 149 150 // operateur == 151 inline bool operator == (const T & v) INLINE; 152 153 // bind to in interface 154 void operator () (sc_signal<data_type> & s) { 155 sc_core::bind(*this, s); 156 } 157 158 // binding for hierarchical description 159 void operator () (this_type & parent_) { 160 sc_core::bind(*this, parent_); 161 } 162 163 void operator () (sc_out<data_type> & o) { 164 sc_core::bind(*this, o); 165 } 166 167 /*virtual */~sc_in() {}; 168 169 }; 170 171 172 template < typename T > 173 void sc_in< T >::init() { 174 set_kind(sc_in_string); 175 sc_interface::init(sizeof(data_type)); 176 } 177 178 179 // read 180 template < typename T > inline 181 const T & sc_in< T >::read() const { 182 #ifdef DUMP_READ 183 std::cerr << "read " << READ_SIGNAL(const T &, get_pointer()) 184 << " on signal " << name() << "\n"; 185 #endif 186 return READ_SIGNAL(const T, get_pointer()); 187 } 188 189 190 template < typename T > inline 191 sc_in< T >::operator const T & () const { 192 return sc_in< T >::read(); 193 } 194 195 196 template < typename T > inline 197 bool sc_in< T >::operator == (const T & v) { 198 return sc_in< T >::read() == v; 199 } 200 201 202 203 // ---------------------------------------------------------------------------- 204 // CLASS : sc_inout< T > 205 // 206 // ---------------------------------------------------------------------------- 207 208 template < typename T > 209 class sc_inout : public sc_port_base { 210 77 211 /////////// 78 212 // Internal 79 const sc_module &get_module () const; 80 void init (); 81 void check_multiwriting2port () const; 82 /////////// 83 84 friend std::ostream& operator << (std::ostream &, const sc_port_base &); 85 86 // LRM 87 //virtual const sc_event /*&*/ default_event () const; 88 static const char* const kind_string; 89 // virtual const char *kind () const; 90 // 91 sc_port_base(); 92 sc_port_base(const char* name_); 93 explicit sc_port_base(const sc_port_base& parent_); 94 /*virtual */~sc_port_base () {}; 95 // bind to a handle 96 void operator () (method_process_t &func) const; 213 protected: 214 void init(); 215 T val; 216 217 private: 218 typedef T data_type; 219 220 typedef sc_inout<data_type> this_type; 221 typedef sc_signal<data_type> signal_type; 222 223 224 public: 225 // contructeurs 226 sc_inout() : base_type() { init (); }; 227 228 explicit sc_inout(const char * name_) : base_type(name_) { init(); }; 229 230 /* 231 // LRM error ! 232 //static const char *const kind_string; this is a template ! 233 */ 234 235 // read the current value 236 inline const T & read() const INLINE; 237 // write the new value 238 inline void write(const T &) INLINE; 239 template < int W > inline void write(const sc_uint< W > & v) { 240 sc_inout< T >::write(v.read()); 241 } 242 243 inline operator const T & () const INLINE; 244 245 inline sc_inout< T > & operator = (const T & a) INLINE; 246 inline sc_inout< T > & operator = (const sc_signal< T > & a) INLINE; 247 248 // operateur == 249 inline bool operator == (const bool & v) INLINE; 250 251 // bind to in interface 252 void operator () (sc_signal<data_type> & s) { 253 bind(*this); 254 bind(*this, s); 255 } 256 257 void operator () (this_type & parent_) { 258 bind(*this, parent_); 259 } 260 261 /*virtual */~sc_inout() {}; 97 262 }; 98 263 99 template < typename T > class sc_port_b:public sc_port_base 100 { 101 }; 102 103 // ---------------------------------------------------------------------------- 104 // CLASS : sc_in<T> 105 // 106 // ---------------------------------------------------------------------------- 107 108 template <typename T> 109 class sc_in : public sc_port_base 110 { 111 private: 112 typedef T data_type; 113 typedef sc_port_base base_type; 114 typedef sc_in<data_type> this_type; 115 typedef sc_signal<data_type> signal_type; 116 117 /////////// 118 // Internal 119 void init (); 120 /* 121 public: virtual size_t data_size () const 122 { return sizeof (data_type); } 123 */ 124 /////////// 125 public: 126 // constructors 127 sc_in(): base_type() { init (); } 128 129 explicit sc_in(const char* name_): base_type(name_) { init (); } 130 131 explicit sc_in(const base_type& parent_ ): base_type( parent_ ) { init (); } 132 133 /* 134 // LRM error ! 135 //static const char *const kind_string; this is a template ! 136 */ 137 // virtual const char *kind () const 138 // { return "sc_in"; }; 139 140 #if 0 141 // LRM 142 sc_event_finder& neg () const { return *new sc_event_finder (*(sc_port_base*)this);}; 143 sc_event_finder& pos () const { return *new sc_event_finder (*(sc_port_base*)this);}; 144 #endif 145 146 sc_event neg () const { return sc_event (*this, sc_event::NEG);}; 147 sc_event pos () const { return sc_event (*this, sc_event::POS);}; 148 // read the current value 149 inline const T& read() const INLINE; 150 inline operator const T& () const INLINE; 151 152 // operateur == 153 inline bool operator == (const T& v) INLINE; 154 155 // bind to in interface 156 void operator () (sc_signal<data_type> &s) 157 { sc_core::bind (*this,s); } 158 159 // binding for hierarchical description 160 void operator () (this_type &parent_) 161 { sc_core::bind (*this,parent_); } 162 163 void operator () (sc_out<data_type> &o) 164 { sc_core::bind (*this,o); } 165 166 /*virtual */~sc_in() {}; 167 168 }; 169 170 template <typename T> 171 void 172 sc_in<T>::init() 173 { 174 set_kind (sc_in_string); 175 sc_interface::init (sizeof (data_type)); 176 } 177 178 // read 179 template <typename T> inline 180 const T& 181 sc_in<T>::read() const 182 { 183 #ifdef DUMP_READ 184 std::cerr << "read " << READ_SIGNAL(const T&, get_pointer()) 185 << " on signal " << name () << "\n"; 186 #endif 187 return READ_SIGNAL(const T, get_pointer()); 188 } 189 190 template <typename T> inline 191 sc_in<T>::operator const T& () const 192 { return sc_in<T>::read (); } 193 194 template <typename T> inline 195 bool sc_in<T>::operator == (const T& v) { 196 return sc_in<T>::read() == v; 197 } 198 199 // ---------------------------------------------------------------------------- 200 // CLASS : sc_inout<T> 201 // 202 // ---------------------------------------------------------------------------- 203 204 template <typename T> 205 class sc_inout : public sc_port_base 206 { 207 /////////// 208 // Internal 209 protected: 210 void init (); 211 T val; 212 private: 213 typedef T data_type; 214 215 typedef sc_inout<data_type> this_type; 216 typedef sc_signal<data_type> signal_type; 217 218 /* 219 public: virtual size_t data_size () const 220 { return sizeof (data_type); } 221 */ 222 /////////// 223 public: 224 // contructeurs 225 sc_inout(): base_type() { init (); }; 226 227 explicit sc_inout(const char* name_): base_type(name_) { init (); }; 228 229 /* 230 // LRM error ! 231 //static const char *const kind_string; this is a template ! 232 */ 233 //virtual const char *kind () const 234 //{ return "sc_inout"; }; 235 236 // read the current value 237 inline const T& read() const INLINE; 238 // write the new value 239 inline void write( const T& ) INLINE; 240 template <int W> inline void write( const sc_uint<W>& v) 241 { sc_inout<T>::write (v.read()); } 242 243 inline operator const T& () const INLINE; 244 245 inline sc_inout<T>& operator = ( const T& a ) INLINE; 246 247 inline sc_inout<T>& operator = ( const sc_signal<T>& a ) INLINE; 248 249 // inline sc_inout<T>& operator = ( const sc_port_base& a ) INLINE; 250 251 // operateur == 252 inline bool operator == (const bool& v) INLINE; 253 254 // bind to in interface 255 void operator () (sc_signal<data_type> &s) 256 { bind (*this); bind (*this,s); } 257 258 void operator () (this_type &parent_) 259 { bind (*this,parent_); } 260 261 /*virtual */~sc_inout() {}; 262 }; 263 264 template <typename T> 265 void 266 sc_inout<T>::init () 267 { 268 set_pointer ((tab_t*)(void*)&val); 269 sc_object::set_kind (sc_inout_string); 270 sc_interface::init (sizeof (data_type)); 271 /*ref*/ val = (0); 272 //sc_inout::write (0); 264 265 template < typename T > 266 void sc_inout< T >::init() { 267 set_pointer((tab_t *) (void *) &val); 268 sc_object::set_kind(sc_inout_string); 269 sc_interface::init(sizeof(data_type)); 270 /*ref*/ val = (0); 271 //sc_inout::write (0); 273 272 /* Fix : 274 273 * FSM checker generates an error at runtime … … 277 276 } 278 277 278 279 279 // read 280 template <typename T> 281 inline 282 const T& 283 sc_inout<T>::read() const 284 { 280 template < typename T > 281 inline const T & sc_inout< T >::read() const { 285 282 #ifdef DUMP_READ 286 std::cerr << "read " << READ_SIGNAL(const T, get_pointer()) // val 287 << " on signal " << name () << "\n"; 288 #endif 289 // return val; 290 return READ_SIGNAL(const T, get_pointer()); 291 } 283 std::cerr << "read " << READ_SIGNAL(const T, get_pointer()) // val 284 << " on signal " << name () << "\n"; 285 #endif 286 // return val; 287 return READ_SIGNAL(const T, get_pointer()); 288 } 289 292 290 293 291 // write the new value 294 template <typename T> 295 inline 296 void 297 sc_inout<T>::write( const T& value_ ) 298 { 292 template < typename T > 293 inline void sc_inout< T >::write(const T & value_) { 299 294 #ifdef DUMP_WRITE 300 std::cerr << "write " << value_ 301 << " on in/out port (writing into a signal) '" << name () << "'\n"; 302 #endif 303 // T& ref = *(T*)(get_pointer()); 295 std::cerr << "write " << value_ << " on in/out port (writing into a signal) '" << name() << "'\n"; 296 #endif 297 // T& ref = *(T*)(get_pointer()); 304 298 #ifndef USE_PORT_DEPENDENCY 305 unstable |= (value_) != val; //ref; 306 #endif 307 /*ref*/ val = (value_); 308 } 309 310 template <typename T> 311 inline 312 sc_inout<T>::operator const T& () const 313 { return sc_inout<T>::read(); } 314 315 template <typename T> 316 inline sc_inout<T>& sc_inout<T>::operator = ( const T& a ) 317 { sc_inout<T>::write( a ); return *this; } 318 319 template <typename T> 320 inline 321 sc_inout<T>& sc_inout<T>::operator = ( const sc_signal<T>& a ) 322 { sc_inout<T>::write( a.read() ); return *this; } 299 unstable |= (value_) != val; //ref; 300 #endif 301 /*ref*/ val = (value_); 302 } 303 304 305 template < typename T > 306 inline sc_inout< T >::operator const T & () const { 307 return sc_inout< T >::read(); 308 } 309 310 311 template < typename T > 312 inline sc_inout< T > & sc_inout< T >::operator = (const T & a) { 313 sc_inout< T >::write(a); 314 return *this; 315 } 316 317 318 template < typename T > 319 inline sc_inout< T > & sc_inout< T >::operator = (const sc_signal< T > & a) { 320 sc_inout< T >::write(a.read()); 321 return *this; 322 } 323 324 323 325 /* 324 template <typename T> 325 inline 326 sc_inout<T>& sc_inout<T>::operator = ( const sc_port_base& a ) 327 { write( a.read() ); return *this; } 328 */ 329 template <typename T> 330 inline 331 bool sc_inout<T>::operator == (const bool& v) 332 { return sc_inout<T>::read() == v; } 326 template <typename T> 327 inline 328 sc_inout<T>& sc_inout<T>::operator = ( const sc_port_base& a ) 329 { write( a.read() ); return *this; } 330 */ 331 332 333 template < typename T > inline 334 bool sc_inout< T >::operator == (const bool & v) { 335 return sc_inout< T >::read() == v; 336 } 337 333 338 334 339 // ---------------------------------------------------------------------------- … … 340 345 // For debugging reasons, a class is provided instead of a define." 341 346 342 template <typename T> 343 class sc_out : public sc_inout<T> 344 { 345 /////////// 346 // Internal 347 void init (); 348 /////////// 349 public: 350 // typedefs 351 typedef T data_type; 352 typedef sc_inout<T> base_type; 353 typedef sc_out<data_type> this_type; 354 typedef sc_signal<data_type> signal_type; 355 public: 356 // constructors & destructor 357 sc_out(): base_type() { init (); }; 358 explicit sc_out(const char* name_): base_type(name_) { init (); }; 359 sc_out (this_type & parent_); 360 sc_out (const char *name_, this_type & parent_); 361 362 /* 363 // LRM error ! 364 //static const char *const kind_string; this is a template ! 365 */ 366 //virtual const char *kind () const 367 //{ return "sc_out"; }; 368 369 370 inline this_type& operator = ( const data_type& a ) INLINE; 371 inline bool operator == (const bool& v) INLINE; 372 373 // bind to in interface 374 void operator () (sc_signal<data_type> &s) 375 { bind (*this,s); } 347 template < typename T > 348 class sc_out : public sc_inout< T > { 349 350 /////////// 351 // Internal 352 void init(); 353 /////////// 376 354 377 void operator () (this_type &parent_) 378 { bind (*this,parent_); } 379 380 ////////////////////// 381 // Systemcass specific 382 void operator () (sc_port_base &o) 383 { set_port_dependency (&o, (sc_port_base&)(*this)); } 384 /* 385 void operator () () // n'a pas de sens... 386 { set_port_dependency (NULL, (sc_port_base&)(*this)); } 387 */ 388 ////////////////////// 389 390 391 /*virtual */~ sc_out () {}; 392 393 private: 394 // disabled 395 sc_out (const this_type &); 355 public: 356 typedef T data_type; 357 typedef sc_inout< T > base_type; 358 typedef sc_out<data_type> this_type; 359 typedef sc_signal<data_type> signal_type; 360 361 362 // constructors & destructor 363 sc_out() : base_type() { 364 init(); 365 } 366 367 explicit sc_out(const char * name_) : base_type(name_) { 368 init(); 369 } 370 371 sc_out(this_type & parent_); 372 sc_out(const char * name_, this_type & parent_); 373 374 /* 375 // LRM error ! 376 //static const char *const kind_string; this is a template ! 377 */ 378 //virtual const char *kind () const 379 //{ return "sc_out"; }; 380 381 382 inline this_type & operator = (const data_type & a) INLINE; 383 inline bool operator == (const bool & v) INLINE; 384 385 // bind to in interface 386 void operator () (sc_signal<data_type> & s) { 387 bind(*this, s); 388 } 389 390 void operator () (this_type & parent_) { 391 bind(*this, parent_); 392 } 393 394 ////////////////////// 395 // Systemcass specific 396 void operator () (sc_port_base & o) { 397 set_port_dependency(&o, (sc_port_base &) (*this)); 398 } 399 ////////////////////// 400 401 402 /*virtual */~sc_out() {}; 403 404 private: 405 // disabled 406 sc_out(const this_type &); 407 396 408 }; 397 409 398 // 399 template<typename T> 400 void 401 sc_out<T>::init () 402 { 403 sc_inout<T>::init (); 404 // tab_t *t = &(sc_inout<T>::val); 405 // sc_interface::set_pointer (t); 406 sc_object::set_kind (sc_out_string); 407 // sc_interface::init (sizeof (data_type)); 408 // /*ref*/ sc_inout<T>::val = 0; 409 //sc_inout<T>::write (0); 410 411 412 template< typename T > 413 void sc_out< T >::init() { 414 sc_inout< T >::init(); 415 // tab_t *t = &(sc_inout<T>::val); 416 // sc_interface::set_pointer (t); 417 sc_object::set_kind(sc_out_string); 418 // sc_interface::init (sizeof (data_type)); 419 // /*ref*/ sc_inout<T>::val = 0; 420 //sc_inout<T>::write (0); 410 421 /* Fix : 411 422 * FSM checker generates an error at runtime … … 413 424 } 414 425 415 template<typename T> inline 416 sc_out<T>& 417 sc_out<T>::operator = ( const data_type& a ) 418 { sc_out<T>::write( a ); return *this; } 419 420 template<typename T> inline 421 bool 422 sc_out<T>::operator == (const bool& v) 423 { return sc_out<T>::read() == v; } 426 427 template< typename T > 428 inline sc_out< T > & sc_out< T >::operator = (const data_type & a) { 429 sc_out< T >::write(a); 430 return *this; 431 } 432 433 434 template< typename T > 435 inline bool sc_out< T >::operator == (const bool & v) { 436 return sc_out< T >::read() == v; 437 } 438 424 439 425 440 // Dumps 426 template<typename T> inline 427 std::ostream& operator<<( std::ostream& os, const sc_in<T> &r) 428 { return os << r.read (); } 441 template< typename T > 442 inline std::ostream & operator << ( std::ostream & os, const sc_in< T > & r) { 443 return os << r.read(); 444 } 445 429 446 430 447 // Add '&' 431 template<class T> inline 432 std::ostream& operator<<( std::ostream& os, const sc_inout<T> &r) 433 { return os << r.read (); } 434 435 template<class T> inline 436 std::ostream& operator<<( std::ostream& os, const sc_signal<T> &r) 437 { return os << r.read (); } 448 template< class T > 449 inline std::ostream & operator << ( std::ostream & os, const sc_inout< T > & r) { 450 return os << r.read(); 451 } 452 453 454 template< class T > 455 inline std::ostream & operator << ( std::ostream & os, const sc_signal< T > & r) { 456 return os << r.read(); 457 } 458 438 459 439 460 // Declarations … … 449 470 450 471 #endif /* __SC_PORT_EXT_H__ */ 472 473 /* 474 # Local Variables: 475 # tab-width: 4; 476 # c-basic-offset: 4; 477 # c-file-offsets:((innamespace . 0)(inline-open . 0)); 478 # indent-tabs-mode: nil; 479 # End: 480 # 481 # vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 482 */ 483
Note: See TracChangeset
for help on using the changeset viewer.