source: sources/src/sc_port_ext.h @ 47

Last change on this file since 47 was 47, checked in by buchmann, 15 years ago

This patch simplifies SystemCASS.

Remove:

  • ckeckings about multiwriting on registers and ports
  • checkings related to FSM modeling
  • regression tests related to the checkings
File size: 11.0 KB
RevLine 
[1]1/*------------------------------------------------------------\
2|                                                             |
3| Tool    :                  systemcass                       |
4|                                                             |
5| File    :                   sc_port_ext.h                   |
6|                                                             |
7| Author  :                 Buchmann Richard                  |
8|                           Taktak Sami                       |
9|                                                             |
10| Date    :                   09_07_2004                      |
11|                                                             |
12\------------------------------------------------------------*/
13#ifndef __SC_PORT_EXT_H__
14#define __SC_PORT_EXT_H__
15
16// Define registers writing method
[27]17#include <iostream>
18#include <cstdlib>
[35]19
20#ifdef HAVE_CONFIG_H
21#include "config.h"
22#endif
23
24#include "internal_ext.h"
25#include "port_dependency_ext.h"
26#include "sc_event.h"
[27]27#include "sc_fwd.h"
[35]28#include "sc_interface.h"
[27]29#include "sc_nbdefs.h"
30#include "sc_object.h"
[1]31
32
33//__GNUC__
34//__GNUC_MINOR__
35//__GNUC_PATCHLEVEL__
36//
37#if ((__GNUC__ < 3) || (__GNUC_MINOR__ < 4))
38#define INLINE __attribute__((always_inline))
39#else
40/* gcc3.4 doesn't support */ 
41#define INLINE
42#endif
43
44#include <list>
45
46//
47namespace sc_core {
48//
[4]49
[35]50  using namespace sc_dt;
[4]51
[1]52const char *get_name        (const tab_t *pointer);
53
54#define READ_SIGNAL(value_type_,pointer_) \
[35]55  ((value_type_&) (*((value_type_*) (pointer_))))
[1]56
[47]57///////////////////// DEPRECATED
[1]58// C ANSI-only since it is needed to link with extern "C"
59
60extern void bind (sc_port_base&,sc_port_base&);
61extern void bind (sc_port_base&,sc_signal_base&);
62extern void bind (sc_signal_base &x);
63extern void bind (sc_port_base   &x);
64
65// KIND STRING
66extern const char * const sc_inout_string;
67extern const char * const sc_in_string;
68extern const char * const sc_out_string; 
69
70extern "C" void update (void);
71
72class sc_port_base : public sc_object, public sc_interface
73{
74protected:
75  typedef sc_port_base                        base_type;
76public:
[35]77  ///////////
78  // Internal
79  const sc_module &get_module () const;
80  void             init ();
[1]81  void             check_multiwriting2port () const;
[35]82  ///////////     
[1]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;
97};
98
99template < typename T > class sc_port_b:public sc_port_base
100{
101};
102
103// ----------------------------------------------------------------------------
104//  CLASS : sc_in<T>
105//
106// ----------------------------------------------------------------------------
107
108template <typename T>
109class sc_in : public sc_port_base
110{
111private:
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
[35]117  ///////////
118  // Internal
[1]119  void init ();
[35]120  /*
121  public: virtual size_t data_size () const
122  { return sizeof (data_type); }
123  */
124  ///////////
[1]125public:
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
[35]133  /*
[1]134  // LRM error !
135  //static const char *const kind_string; this is a template !
[35]136  */
[1]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
170template <typename T>
171void
172sc_in<T>::init()
173{ 
[35]174  set_kind (sc_in_string);
175  sc_interface::init (sizeof (data_type)); 
[1]176}
177
178// read
179template <typename T> inline 
180const T& 
181sc_in<T>::read() const
182{ 
183#ifdef DUMP_READ
184  std::cerr << "read " << READ_SIGNAL(const T&, get_pointer())
[35]185     << " on signal " << name () << "\n";
[1]186#endif
187  return READ_SIGNAL(const T, get_pointer());
188}
189 
190template <typename T> inline 
191sc_in<T>::operator const T& () const
192{ return sc_in<T>::read (); }
193
194template <typename T> inline 
195bool 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
204template <typename T>
205class sc_inout : public sc_port_base
206{
[35]207  ///////////
208  // Internal
[1]209protected:
210  void init ();
[35]211  T val;
[1]212private:
213  typedef T                                   data_type;
214
215  typedef sc_inout<data_type>                 this_type;
216  typedef sc_signal<data_type>                signal_type;
217
[35]218  /*
219  public: virtual size_t data_size () const
220  { return sizeof (data_type); }
221  */
222  ///////////
[1]223public:
224  // contructeurs
225  sc_inout(): base_type() { init (); };
226
227  explicit sc_inout(const char* name_): base_type(name_) { init (); };
228
[35]229  /*
[1]230  // LRM error !
231  //static const char *const kind_string; this is a template !
[35]232  */
[1]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
264template <typename T>
265void
266sc_inout<T>::init ()
267{
[35]268  set_pointer ((tab_t*)(void*)&val);
269  sc_object::set_kind    (sc_inout_string);
270  sc_interface::init (sizeof (data_type)); 
[1]271  /*ref*/ val = (0);
272  //sc_inout::write (0);
273    /* Fix :
274     * FSM checker generates an error at runtime
275     */
276
277}
278
279// read
280template <typename T>
281inline 
282const T& 
283sc_inout<T>::read() const
284{ 
285#ifdef DUMP_READ
286  std::cerr << "read " << READ_SIGNAL(const T, get_pointer()) // val
[35]287     << " on signal " << name () << "\n";
[1]288#endif
289//  return val;
290  return READ_SIGNAL(const T, get_pointer());
291}
292
293// write the new value
294template <typename T>
295inline
296void
297sc_inout<T>::write( const T& value_ )
298{
299#ifdef DUMP_WRITE
300  std::cerr << "write " << value_
301            << " on in/out port (writing into a signal) '" << name () << "'\n";
302#endif
[35]303//  T& ref = *(T*)(get_pointer());
[1]304#ifndef USE_PORT_DEPENDENCY
305  unstable |= (value_) != val; //ref;
306#endif
307  /*ref*/ val = (value_);
308}
309
310template <typename T>
311inline 
312sc_inout<T>::operator const T& () const
313{ return sc_inout<T>::read(); }
314
315template <typename T>
316inline sc_inout<T>& sc_inout<T>::operator = ( const T& a )
317{ sc_inout<T>::write( a ); return *this; }
318
319template <typename T>
320inline 
321sc_inout<T>& sc_inout<T>::operator = ( const sc_signal<T>& a )
322{ sc_inout<T>::write( a.read() ); return *this; }
323/*
324template <typename T>
325inline
326sc_inout<T>& sc_inout<T>::operator = ( const sc_port_base& a )
327{ write( a.read() ); return *this; }
328*/
329template <typename T>
330inline 
331bool sc_inout<T>::operator == (const bool& v) 
332{ return sc_inout<T>::read() == v; }
333
334// ----------------------------------------------------------------------------
335//  CLASS : sc_out<T>
336//
337// ----------------------------------------------------------------------------
338// Official SystemC implementation notes :
339// "sc_out can also read from its port, hence no difference with sc_inout.
340// For debugging reasons, a class is provided instead of a define."
341
342template <typename T>
343class sc_out : public sc_inout<T>
344{
[35]345  ///////////
346  // Internal
[1]347  void init ();
[35]348  ///////////
[1]349public:
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;
355public:
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
[35]362  /*
[1]363  // LRM error !
364  //static const char *const kind_string; this is a template !
[35]365  */
[1]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); }
376 
377  void operator () (this_type &parent_) 
378  { bind (*this,parent_); }
379
[35]380  //////////////////////
381  // Systemcass specific
[1]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*/
[35]388  //////////////////////
[1]389
390
391  /*virtual */~ sc_out () {};
392
393private:
394  // disabled
395  sc_out (const this_type &);
396};
397
398//
399template<typename T>
400void
401sc_out<T>::init ()
402{
403  sc_inout<T>::init ();
[35]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));
[1]408//  /*ref*/ sc_inout<T>::val = 0;
409  //sc_inout<T>::write (0);
410    /* Fix :
411     * FSM checker generates an error at runtime
412     */
413}
414
415template<typename T> inline 
416sc_out<T>& 
417sc_out<T>::operator = ( const data_type& a )
418{ sc_out<T>::write( a ); return *this; }
419
420template<typename T> inline 
421bool 
422sc_out<T>::operator == (const bool& v) 
423{ return sc_out<T>::read() == v; }
424
425// Dumps
426template<typename T> inline 
427std::ostream& operator<<( std::ostream& os, const sc_in<T> &r) 
428{ return os << r.read (); }
429
430// Add '&'
431template<class T> inline 
432std::ostream& operator<<( std::ostream& os, const sc_inout<T> &r) 
433{ return os << r.read (); }
434
435template<class T> inline 
436std::ostream& operator<<( std::ostream& os, const sc_signal<T> &r)
437{ return os << r.read (); }
438
439// Declarations
440typedef sc_in<bool> sc_in_clk;
441
442#undef INLINE
443
444#undef READ_SIGNAL
445
446} // end of sc_core namespace
447
448using sc_core::sc_in_clk;
449
450#endif /* __SC_PORT_EXT_H__ */
Note: See TracBrowser for help on using the repository browser.