sc_signal.hh revision 12912:8a06e701c31a
1/*
2 * Copyright 2018 Google, Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met: redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer;
8 * redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution;
11 * neither the name of the copyright holders nor the names of its
12 * contributors may be used to endorse or promote products derived from
13 * this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 * Authors: Gabe Black
28 */
29
30#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
31#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
32
33#include <iostream>
34
35#include "../core/sc_module.hh" // for sc_gen_unique_name
36#include "../core/sc_prim.hh"
37#include "sc_signal_inout_if.hh"
38#include "warn_unimpl.hh" // for warn_unimpl
39
40namespace sc_core
41{
42
43class sc_port_base;
44
45template <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER>
46class sc_signal : public sc_signal_inout_if<T>,
47                  public sc_prim_channel
48{
49  public:
50    sc_signal() : sc_signal_inout_if<T>(),
51                  sc_prim_channel(sc_gen_unique_name("signal"))
52    {}
53    explicit sc_signal(const char *name) : sc_signal_inout_if<T>(),
54                                           sc_prim_channel(name)
55    {}
56    explicit sc_signal(const char *name, const T &initial_value) :
57        sc_signal_inout_if<T>(), sc_prim_channel(name)
58    {
59        // Need to consume initial_value.
60        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
61    }
62    virtual ~sc_signal() {}
63
64    virtual void
65    register_port(sc_port_base &, const char *)
66    {
67        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
68    }
69
70    virtual const T&
71    read() const
72    {
73        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
74        return *(const T *)nullptr;
75    }
76    operator const T&() const
77    {
78        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
79        return *(const T *)nullptr;
80    }
81
82    virtual sc_writer_policy
83    get_writer_policy() const
84    {
85        return WRITER_POLICY;
86    }
87    virtual void
88    write(const T&)
89    {
90        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
91    }
92    sc_signal<T, WRITER_POLICY> &
93    operator = (const T&)
94    {
95        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
96        return *this;
97    }
98    sc_signal<T, WRITER_POLICY> &
99    operator = (const sc_signal<T, WRITER_POLICY> &)
100    {
101        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
102        return *this;
103    }
104
105    virtual const sc_event &
106    default_event() const
107    {
108        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
109        return *(sc_event *)nullptr;
110    }
111    virtual const sc_event &
112    value_changed_event() const
113    {
114        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
115        return *(sc_event *)nullptr;
116    }
117    virtual bool
118    event() const
119    {
120        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
121        return false;
122    }
123
124    virtual void
125    print(std::ostream & =std::cout) const
126    {
127        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
128    }
129    virtual void
130    dump(std::ostream & =std::cout) const
131    {
132        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
133    }
134    virtual const char *kind() const { return "sc_signal"; }
135
136  protected:
137    virtual void
138    update()
139    {
140        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
141    }
142
143  private:
144    // Disabled
145    sc_signal(const sc_signal<T, WRITER_POLICY> &) :
146            sc_signal_inout_if<T>(), sc_prim_channel("")
147    {}
148};
149
150template <class T, sc_writer_policy WRITER_POLICY>
151inline std::ostream &
152operator << (std::ostream &os, const sc_signal<T, WRITER_POLICY> &)
153{
154    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
155    return os;
156}
157
158template <sc_writer_policy WRITER_POLICY>
159class sc_signal<bool, WRITER_POLICY> :
160    public sc_signal_inout_if<bool>, public sc_prim_channel
161{
162  public:
163    sc_signal()
164    {
165        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
166    }
167    explicit sc_signal(const char *)
168    {
169        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
170    }
171    explicit sc_signal(const char *name, const bool &initial_value) :
172        sc_signal_inout_if<bool>(), sc_prim_channel(name)
173    {
174        // Need to consume initial_value.
175        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
176    }
177    virtual ~sc_signal()
178    {
179        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
180    }
181
182    virtual void
183    register_port(sc_port_base &, const char *)
184    {
185        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
186    }
187
188    virtual const bool &
189    read() const
190    {
191        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
192        return *(const bool *)nullptr;
193    }
194    operator const bool &() const
195    {
196        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
197        return *(const bool *)nullptr;
198    }
199
200    virtual sc_writer_policy
201    get_writer_policy() const
202    {
203        return WRITER_POLICY;
204    }
205    virtual void
206    write(const bool &)
207    {
208        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
209    }
210    sc_signal<bool, WRITER_POLICY> &
211    operator = (const bool &)
212    {
213        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
214        return *this;
215    }
216    sc_signal<bool, WRITER_POLICY> &
217    operator = (const sc_signal<bool, WRITER_POLICY> &)
218    {
219        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
220        return *this;
221    }
222
223    virtual const sc_event &
224    default_event() const
225    {
226        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
227        return *(sc_event *)nullptr;
228    }
229
230    virtual const sc_event &
231    value_changed_event() const
232    {
233        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
234        return *(sc_event *)nullptr;
235    }
236    virtual const sc_event &
237    posedge_event() const
238    {
239        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
240        return *(sc_event *)nullptr;
241    }
242    virtual const sc_event &
243    negedge_event() const
244    {
245        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
246        return *(sc_event *)nullptr;
247    }
248
249    virtual bool
250    event() const
251    {
252        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
253        return false;
254    }
255    virtual bool
256    posedge() const
257    {
258        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
259        return false;
260    }
261    virtual bool
262    negedge() const
263    {
264        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
265        return false;
266    }
267
268    virtual void
269    print(std::ostream & =std::cout) const
270    {
271        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
272    }
273    virtual void
274    dump(std::ostream & =std::cout) const
275    {
276        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
277    }
278    virtual const char *kind() const { return "sc_signal"; }
279
280  protected:
281    virtual void
282    update()
283    {
284        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
285    }
286
287  private:
288    // Disabled
289    sc_signal(const sc_signal<bool, WRITER_POLICY> &) :
290            sc_signal_inout_if<bool>(), sc_prim_channel("")
291    {}
292};
293
294template <sc_writer_policy WRITER_POLICY>
295class sc_signal<sc_dt::sc_logic, WRITER_POLICY> :
296    public sc_signal_inout_if<sc_dt::sc_logic>, public sc_prim_channel
297{
298  public:
299    sc_signal()
300    {
301        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
302    }
303    explicit sc_signal(const char *)
304    {
305        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
306    }
307    explicit sc_signal(const char *name,
308            const sc_dt::sc_logic &initial_value) :
309        sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name)
310    {
311        // Need to consume initial_value.
312        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
313    }
314    virtual ~sc_signal()
315    {
316        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
317    }
318
319    virtual void
320    register_port(sc_port_base &, const char *)
321    {
322        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
323    }
324
325    virtual const sc_dt::sc_logic &
326    read() const
327    {
328        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
329        return *(const sc_dt::sc_logic *)nullptr;
330    }
331    operator const sc_dt::sc_logic &() const
332    {
333        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
334        return *(const sc_dt::sc_logic *)nullptr;
335    }
336
337    virtual sc_writer_policy
338    get_writer_policy() const
339    {
340        return WRITER_POLICY;
341    }
342    virtual void
343    write(const sc_dt::sc_logic &)
344    {
345        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
346    }
347    sc_signal<sc_dt::sc_logic, WRITER_POLICY> &
348    operator = (const sc_dt::sc_logic &)
349    {
350        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
351        return *this;
352    }
353    sc_signal<sc_dt::sc_logic, WRITER_POLICY> &
354    operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &)
355    {
356        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
357        return *this;
358    }
359
360    virtual const sc_event &
361    default_event() const
362    {
363        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
364        return *(sc_event *)nullptr;
365    }
366
367    virtual const sc_event &
368    value_changed_event() const
369    {
370        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
371        return *(sc_event *)nullptr;
372    }
373    virtual const sc_event &
374    posedge_event() const
375    {
376        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
377        return *(sc_event *)nullptr;
378    }
379    virtual const sc_event &
380    negedge_event() const
381    {
382        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
383        return *(sc_event *)nullptr;
384    }
385
386    virtual bool
387    event() const
388    {
389        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
390        return false;
391    }
392    virtual bool
393    posedge() const
394    {
395        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
396        return false;
397    }
398    virtual bool
399    negedge() const
400    {
401        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
402        return false;
403    }
404
405    virtual void
406    print(std::ostream & =std::cout) const
407    {
408        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
409    }
410    virtual void
411    dump(std::ostream & =std::cout) const
412    {
413        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
414    }
415    virtual const char *kind() const { return "sc_signal"; }
416
417  protected:
418    virtual void
419    update()
420    {
421        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
422    }
423
424  private:
425    // Disabled
426    sc_signal(const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &) :
427            sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel("")
428    {}
429};
430
431} // namespace sc_core
432
433#endif  //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__
434