Changeset 59 for sources/src/sc_signal.h


Ignore:
Timestamp:
Feb 6, 2017, 11:35:42 AM (7 years ago)
Author:
meunier
Message:
  • Fixed memory leaks
  • Fixed indentation in some files
File:
1 edited

Legend:

Unmodified
Added
Removed
  • sources/src/sc_signal.h

    r52 r59  
    1818#include <iostream>
    1919#include <cstdlib>
     20#include <typeinfo> // for typeid
    2021
    2122#include "sc_fwd.h"
     
    5354    base_type * pointer;
    5455    base_type value;
    55     //pending_write_t(base_type * const pointer_, const base_type value_) {
    56     //    pointer = pointer_;
    57     //    value = value_;
    58     //}
    5956   
    6057    friend std::ostream & operator << (std::ostream & o, const pending_write_t & p) {
     
    7673
    7774template < typename T >
    78 inline void post_write(base_type * const pointer_, const T value_) /*INLINE*/;
    79 
    80 template < typename T >
    81 inline void post_multiwrite(base_type * const pointer_, const T value_) {
     75inline void post_write(base_type * const pointer_, const T & value_) /*INLINE*/;
     76
     77template < typename T >
     78inline void post_multiwrite(base_type * const pointer_, const T & value_) {
    8279    size_t size = (sizeof(T) - 1) / sizeof(base_type);
    8380    size_t i = 0;
    84     const base_type * pvalue = (const base_type *) (void *) (& value_);
     81    const base_type * pvalue = (const base_type *) (void *) (&value_);
    8582    do {
    8683        post_write(pointer_ + i, pvalue[i]);
     
    8986
    9087template < typename T >
    91 inline void post_write(base_type * const pointer_, const T value_) {
     88inline void post_write(base_type * const pointer_, const T & value_) {
    9289    if (sizeof(T) > sizeof(base_type)) {
    93         post_multiwrite(pointer_,value_);
     90        post_multiwrite(pointer_, value_);
    9491    }
    9592    else {
     
    166163
    167164    private:
     165
    168166    T val;
     167
    169168    typedef T data_type;
    170169    typedef sc_signal < T > this_type;
     
    182181    // constructors, destructor
    183182    sc_signal() {
     183        if (typeid(data_type) == typeid(double) || typeid(data_type) == typeid(float)) {
     184            std::cerr << "Error: SystemCASS does not support sc_signal<T> with T of type " << typeid(data_type).name() << std::endl;
     185            exit(1);
     186        }
    184187        init();
    185188    }
     
    215218    }
    216219
    217     const data_type & get_new_value() const;
     220    const data_type & get_new_value() const {
     221        // Warning: untested and doesn't support variable size
     222        unsigned int i = 0;
     223        for (i = 0; i < pending_write_vector_capacity; i++) {
     224            if (pending_write_vector[i].pointer == get_pointer()) {
     225                return pending_write_vector[i].value;
     226            }
     227        }
     228        return val;
     229    }
    218230
    219231    //  void trace (sc_trace_file * tf) const;
     
    235247    set_kind(kind_string);
    236248    sc_interface::init(sizeof(data_type));
    237     val = 0; /* The simulator initializes the signal/register to 0.    */
     249    val = (T) 0; /* The simulator initializes the signal/register to 0.    */
    238250    /* However, hardware initialization still has to be done. */
    239251    /* This kind of initialization is for trace diffing.      */
     
    245257/*virtual*/ inline const T & sc_signal< T >::read() const {
    246258#ifdef DUMP_READ
    247     std::cerr << "read " << READ_SIGNAL(const T, get_pointer()) << " on signal " << name() << "\n";
    248 #endif
    249     return READ_SIGNAL(const T, get_pointer());
     259    std::cerr << "read " << READ_SIGNAL(const data_type, get_pointer()) << " on signal " << name() << "\n";
     260#endif
     261    // QM
     262    return READ_SIGNAL(T, get_pointer());
    250263}
    251264
     
    266279    std::cerr << "write (posted) " << value_ << " on sc_signal (writing into register) '" << name() << "'\n";
    267280#endif
     281   
    268282    post_write(/*(tab_t*)&val*/ get_pointer(), value_);
    269283}
Note: See TracChangeset for help on using the changeset viewer.