Changeset 60 for sources/src/sc_signal.h
- Timestamp:
- Feb 14, 2017, 11:30:19 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sources/src/sc_signal.h
r59 r60 18 18 #include <iostream> 19 19 #include <cstdlib> 20 #include <cstring> 20 21 #include <typeinfo> // for typeid 21 22 … … 67 68 // Pending write to register (simple stack) 68 69 typedef pending_write_t * pending_write_vector_t; 70 extern "C" int32_t * pending_write_vector_nb; 71 extern "C" unsigned long long int total_assig; 72 #pragma omp threadprivate(pending_write_vector_nb, total_assig) 73 extern unsigned int pending_write_vector_capacity; 74 69 75 extern pending_write_vector_t pending_write_vector; 70 extern "C" unsigned int pending_write_vector_nb; 71 extern unsigned int pending_write_vector_capacity; 72 76 #pragma omp threadprivate(pending_write_vector) 73 77 74 78 template < typename T > … … 92 96 else { 93 97 #if defined(CONFIG_DEBUG) 94 if ( pending_write_vector_nb >= pending_write_vector_capacity) {98 if (*pending_write_vector_nb >= pending_write_vector_capacity) { 95 99 std::cerr << "Error : The array for posted writing on register is too small.\n"; 96 100 std::cerr << "Up to 1 writing per register is allowed during a cycle.\n"; … … 99 103 } 100 104 #endif 101 pending_write_vector[ pending_write_vector_nb].pointer = pointer_;102 // pending_write_vector[ pending_write_vector_nb++].value = *(reinterpret_cast<const base_type*const>(&value_)); => bug !103 pending_write_vector[ pending_write_vector_nb++].value = value_; // => bug avec blues !105 pending_write_vector[*pending_write_vector_nb].pointer = pointer_; 106 // pending_write_vector[(*pending_write_vector_nb)++].value = *(reinterpret_cast<const base_type*const>(&value_)); => bug ! 107 pending_write_vector[(*pending_write_vector_nb)++].value = value_; // => bug avec blues ! 104 108 105 109 // -> fix to use user-defined struct in sc_signal/sc_in/sc_out/sc_inout 106 // pending_write_vector[ pending_write_vector_nb++].value = *((base_type*)&value_); => bug !110 // pending_write_vector[(*pending_write_vector_nb)++].value = *((base_type*)&value_); => bug ! 107 111 #if 0 108 112 std::cerr << "posted write : ptr = " << pointer_ << ", val = " << value_ << "\n"; … … 119 123 120 124 inline bool is_posted_write() { 121 return pending_write_vector_nb > 0;125 return *pending_write_vector_nb > 0; 122 126 } 123 127 … … 165 169 166 170 T val; 167 171 T new_val; 168 172 typedef T data_type; 169 173 typedef sc_signal < T > this_type; … … 216 220 sc_signal< T >::write(read() + a.read()); 217 221 return *this; 222 } 223 224 inline void * operator new (size_t size, size_t align) { 225 void * p; 226 const size_t nsize = (size + align - 1) & ~(align - 1); 227 if (nsize < size) { 228 std::cerr << "sc_signal new() alignement doesn't work (" << 229 nsize << " < " << size << ")" << std::endl; 230 abort(); 231 } 232 233 if (posix_memalign(&p, align, nsize) == 0) { 234 return p; 235 } 236 else { 237 return NULL; 238 } 239 } 240 241 inline void * operator new (size_t size) { 242 return malloc(size); 243 } 244 245 inline void * operator new (size_t size, void * p) { 246 return p; 218 247 } 219 248 … … 247 276 set_kind(kind_string); 248 277 sc_interface::init(sizeof(data_type)); 278 #if 0 249 279 val = (T) 0; /* The simulator initializes the signal/register to 0. */ 250 /* However, hardware initialization still has to be done. */ 251 /* This kind of initialization is for trace diffing. */ 280 /* However, hardware initialization still has to be done. */ 281 /* This kind of initialization is for trace diffing. */ 282 #else 283 memset(&val, 0, sizeof(val)); 284 #endif 252 285 } 253 286 … … 267 300 template < typename T > 268 301 inline void sc_signal< T >::write(const data_type & value_) { 302 if (sc_signal< T >::val == value_ && sc_signal< T >::new_val == value_) { 303 return; 304 } 269 305 #ifdef CONFIG_DEBUG 270 306 if (get_pointer() == NULL) { … … 279 315 std::cerr << "write (posted) " << value_ << " on sc_signal (writing into register) '" << name() << "'\n"; 280 316 #endif 281 317 sc_signal<T>::new_val = value_; 282 318 post_write(/*(tab_t*)&val*/ get_pointer(), value_); 283 319 }
Note: See TracChangeset
for help on using the changeset viewer.