Changeset 60 for sources/src/sc_signal.h


Ignore:
Timestamp:
Feb 14, 2017, 11:30:19 AM (7 years ago)
Author:
meunier
Message:
  • Intégration des modifications de Clément, qui a intégré la version parallélisée de systemcass faite par Manuel.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • sources/src/sc_signal.h

    r59 r60  
    1818#include <iostream>
    1919#include <cstdlib>
     20#include <cstring>
    2021#include <typeinfo> // for typeid
    2122
     
    6768// Pending write to register (simple stack)
    6869typedef pending_write_t * pending_write_vector_t;
     70extern "C" int32_t * pending_write_vector_nb;
     71extern "C" unsigned long long int total_assig;
     72#pragma omp threadprivate(pending_write_vector_nb, total_assig)
     73extern unsigned int pending_write_vector_capacity;
     74
    6975extern 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)
    7377
    7478template < typename T >
     
    9296    else {
    9397#if defined(CONFIG_DEBUG)
    94         if (pending_write_vector_nb >= pending_write_vector_capacity) {
     98        if (*pending_write_vector_nb >= pending_write_vector_capacity) {
    9599            std::cerr << "Error : The array for posted writing on register is too small.\n";
    96100            std::cerr << "Up to 1 writing per register is allowed during a cycle.\n";
     
    99103        }
    100104#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 !
    104108
    105109        // -> 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 !
    107111#if 0
    108112        std::cerr << "posted write : ptr = " << pointer_ << ", val = " << value_ << "\n";
     
    119123
    120124inline bool is_posted_write() {
    121     return pending_write_vector_nb > 0;
     125    return *pending_write_vector_nb > 0;
    122126}
    123127
     
    165169
    166170    T val;
    167 
     171    T new_val;
    168172    typedef T data_type;
    169173    typedef sc_signal < T > this_type;
     
    216220        sc_signal< T >::write(read() + a.read());
    217221        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;
    218247    }
    219248
     
    247276    set_kind(kind_string);
    248277    sc_interface::init(sizeof(data_type));
     278#if 0
    249279    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
    252285}
    253286
     
    267300template < typename T >
    268301inline 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    }
    269305#ifdef CONFIG_DEBUG
    270306    if (get_pointer() == NULL) {
     
    279315    std::cerr << "write (posted) " << value_ << " on sc_signal (writing into register) '" << name() << "'\n";
    280316#endif
    281    
     317    sc_signal<T>::new_val = value_;
    282318    post_write(/*(tab_t*)&val*/ get_pointer(), value_);
    283319}
Note: See TracChangeset for help on using the changeset viewer.