source: trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Signal.h @ 40

Last change on this file since 40 was 40, checked in by rosiere, 17 years ago

Interface et Signal, c'est deux classes enregistres la valeurs des signaux à chaque cycle ... étape préparatoire avan le changement de la classe Vhdl_Testbench

File size: 5.1 KB
Line 
1#ifndef morpheo_behavioural_Signal_h
2#define morpheo_behavioural_Signal_h
3
4/*
5 * $Id$
6 *
7 * [ Description ]
8 *
9 */
10
11#ifdef SYSTEMC
12#include "systemc.h"
13#endif
14
15#include <stdint.h>
16#include <iostream>
17
18#ifdef VHDL_TESTBENCH
19#include "Behavioural/include/Vhdl_Testbench.h"
20#endif
21
22#include "Behavioural/include/Direction.h"
23#include "Behavioural/include/XML.h"
24#include "Include/ErrorMorpheo.h"
25#include "Include/ToBase2.h"
26#include "Include/ToString.h"
27#include "Include/Debug.h"
28
29using namespace std;
30
31namespace morpheo              {
32namespace behavioural          {
33
34  typedef enum {UNKNOW                     ,
35                BOOL                       ,
36                UINT8_T                    ,
37                UINT16_T                   ,
38                UINT32_T                   ,
39                UINT64_T                   } type_info_t;
40
41  typedef enum {PORT_VHDL_YES_TESTBENCH_YES,
42                PORT_VHDL_YES_TESTBENCH_NO ,
43                PORT_VHDL_NO_TESTBENCH_YES ,
44                PORT_VHDL_NO_TESTBENCH_NO  } presence_port_t;
45
46  class Signal
47  {
48    friend class Interface;
49
50    // -----[ fields ]----------------------------------------------------
51  private   : const string          _name         ;
52  private   : const direction_t     _direction    ;
53  private   : const uint32_t        _size         ;
54  private   : const presence_port_t _presence_port;
55
56#ifdef VHDL_TESTBENCH
57  private   : void *                _signal       ;
58  private   : type_info_t           _type_info    ;
59
60  private   : list<string>        * _list_value   ;
61#endif
62
63    // -----[ methods ]---------------------------------------------------
64  public    :                   Signal          (string          name          ,
65                                                 direction_t     direction     ,
66                                                 uint32_t        size          ,
67                                                 presence_port_t presence_port = PORT_VHDL_YES_TESTBENCH_YES);
68  public    :                   Signal          (const Signal &);
69  public    :                   ~Signal         ();
70
71#ifdef VHDL_TESTBENCH
72  public    :template <typename T>
73             T                  read (void)
74    {
75      switch (_direction)
76        {
77        case IN  : {return read_in  <T>();}
78        case OUT : {return read_out <T>();}
79        default  : throw (ErrorMorpheo ("Signal \""+_name+"\" : direction unknow."));
80        }
81    }
82
83  public    :template <typename T>
84             T                  read_in (void)
85    {
86      switch (_type_info)
87        {
88        case BOOL     : return (static_cast<sc_in  <bool    > *>(_signal)->read()); 
89        case UINT8_T  : return (static_cast<sc_in  <uint8_t > *>(_signal)->read()); 
90        case UINT16_T : return (static_cast<sc_in  <uint16_t> *>(_signal)->read());
91        case UINT32_T : return (static_cast<sc_in  <uint32_t> *>(_signal)->read()); 
92        case UINT64_T : return (static_cast<sc_in  <uint64_t> *>(_signal)->read()); 
93        default       : throw (ErrorMorpheo ("Signal \""+_name+"\" : type unknow."));
94        }
95    }
96
97  public    :template <typename T>
98             T                  read_out(void)
99    {
100      switch (_type_info)
101        {
102        case BOOL     : return (static_cast<sc_out <bool    > *>(_signal)->read()); 
103        case UINT8_T  : return (static_cast<sc_out <uint8_t > *>(_signal)->read()); 
104        case UINT16_T : return (static_cast<sc_out <uint16_t> *>(_signal)->read());
105        case UINT32_T : return (static_cast<sc_out <uint32_t> *>(_signal)->read()); 
106        case UINT64_T : return (static_cast<sc_out <uint64_t> *>(_signal)->read()); 
107        default       : throw (ErrorMorpheo ("Signal \""+_name+"\" : type unknow."));
108        }
109    }
110
111  public    : void              testbench       (Vhdl_Testbench * & vhdl_testbench);
112
113  public    : template <typename T>
114              void              alloc           (void * port)
115    {
116      if (_type_info != UNKNOW)
117        throw (ErrorMorpheo ("Signal \""+_name+"\" : already allocate."));
118
119      _signal    = port;
120
121      if (typeid(T) == typeid(bool    ))
122        _type_info = BOOL;
123      else
124      if (typeid(T) == typeid(uint8_t ))
125        _type_info = UINT8_T;
126      else
127      if (typeid(T) == typeid(uint16_t))
128        _type_info = UINT16_T;
129      else
130      if (typeid(T) == typeid(uint32_t))
131        _type_info = UINT32_T;
132      else
133      if (typeid(T) == typeid(uint64_t))
134        _type_info = UINT64_T;
135      else
136        _type_info = UNKNOW;
137    }
138#endif
139
140  public    : XML               toXML           (void);
141
142  public    : friend ostream&   operator<<      (ostream& output_stream,
143                                                 morpheo::behavioural::Signal & x);
144
145  };
146}; // end namespace behavioural         
147
148  template<>           inline std::string toString<morpheo::behavioural::presence_port_t>(const morpheo::behavioural::presence_port_t& x)
149  {
150    switch (x)
151      {
152      case morpheo::behavioural::PORT_VHDL_YES_TESTBENCH_YES : return "Port is in VHDL's model and TestBench's model" ; break;
153      case morpheo::behavioural::PORT_VHDL_YES_TESTBENCH_NO  : return "Port is in VHDL's model                      " ; break;
154      case morpheo::behavioural::PORT_VHDL_NO_TESTBENCH_YES  : return "Port is in                  TestBench's model" ; break;
155      case morpheo::behavioural::PORT_VHDL_NO_TESTBENCH_NO   : return "Port is in none model                        " ; break;
156      default                                                : return "";                                               break;
157      }
158  }
159
160}; // end namespace morpheo             
161
162#endif
Note: See TracBrowser for help on using the repository browser.