sc_in.hh revision 12841:22aa7ba47bf9
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_IN_HH__
31#define __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
32
33#include <string>
34
35#include "../core/sc_port.hh"
36#include "sc_signal_in_if.hh"
37#include "sc_signal_inout_if.hh"
38#include "warn_unimpl.hh"
39
40namespace sc_core
41{
42
43class sc_event;
44class sc_event_finder;
45class sc_trace_file;
46
47template <class T>
48class sc_in : public sc_port<sc_signal_in_if<T>, 1>
49{
50  public:
51    sc_in() : sc_port<sc_signal_in_if<T>, 1>() {}
52    explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name) {}
53    virtual ~sc_in() {}
54
55    virtual void
56    bind(const sc_signal_in_if<T> &)
57    {
58        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
59    }
60    void
61    operator () (const sc_signal_in_if<T> &)
62    {
63        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
64    }
65
66    virtual void
67    bind(sc_port<sc_signal_in_if<T>, 1> &)
68    {
69        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
70    }
71    void
72    operator () (sc_port<sc_signal_in_if<T>, 1> &)
73    {
74        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
75    }
76
77    virtual void
78    bind(sc_port<sc_signal_inout_if<T>, 1> &)
79    {
80        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
81    }
82    void
83    operator () (sc_port<sc_signal_inout_if<T>, 1> &)
84    {
85        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
86    }
87
88    virtual void
89    end_of_elaboration()
90    {
91        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
92    }
93
94    const T &
95    read() const
96    {
97        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
98        return *(const T *)nullptr;
99    }
100    operator const T& () const
101    {
102        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
103        return *(const T *)nullptr;
104    }
105
106    const sc_event &
107    default_event() const
108    {
109        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
110        return *(const sc_event *)nullptr;
111    }
112    const sc_event &
113    value_changed_event() const
114    {
115        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
116        return *(const sc_event *)nullptr;
117    }
118    bool
119    event() const
120    {
121        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
122        return false;
123    }
124    sc_event_finder &
125    value_changed() const
126    {
127        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
128        return *(sc_event_finder *)nullptr;
129    }
130
131    virtual const char *kind() const { return "sc_in"; }
132
133  private:
134    // Disabled
135    sc_in(const sc_in<T> &) : sc_port<sc_signal_in_if<T>, 1>() {}
136    sc_in<T> &operator = (const sc_in<T> &) { return *this; }
137};
138
139template <class T>
140inline void
141sc_trace(sc_trace_file *, const sc_in<T> &, const std::string &)
142{
143    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
144}
145
146template <>
147class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1>
148{
149  public:
150    sc_in() : sc_port<sc_signal_in_if<bool>, 1>() {}
151    explicit sc_in(const char *name) :
152        sc_port<sc_signal_in_if<bool>, 1>(name) {}
153    virtual ~sc_in() {}
154
155    virtual void
156    bind(const sc_signal_in_if<bool> &)
157    {
158        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
159    }
160    void
161    operator () (const sc_signal_in_if<bool> &)
162    {
163        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
164    }
165
166    virtual void
167    bind(sc_port<sc_signal_in_if<bool>, 1> &)
168    {
169        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
170    }
171    void
172    operator () (sc_port<sc_signal_in_if<bool>, 1> &)
173    {
174        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
175    }
176
177    virtual void
178    bind(sc_port<sc_signal_inout_if<bool>, 1> &)
179    {
180        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
181    }
182    void
183    operator () (sc_port<sc_signal_inout_if<bool>, 1> &)
184    {
185        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
186    }
187
188    virtual void
189    end_of_elaboration()
190    {
191        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
192    }
193
194    const bool &
195    read() const
196    {
197        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
198        return *(const bool *)nullptr;
199    }
200    operator const bool& () const
201    {
202        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
203        return *(const bool *)nullptr;
204    }
205
206    const sc_event &
207    default_event() const
208    {
209        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
210        return *(const sc_event *)nullptr;
211    }
212    const sc_event &
213    value_changed_event() const
214    {
215        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
216        return *(const sc_event *)nullptr;
217    }
218    const sc_event &
219    posedge_event() const
220    {
221        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
222        return *(const sc_event *)nullptr;
223    }
224    const sc_event &
225    negedge_event() const
226    {
227        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
228        return *(const sc_event *)nullptr;
229    }
230
231    bool
232    event() const
233    {
234        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
235        return false;
236    }
237    bool
238    posedge() const
239    {
240        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
241        return false;
242    }
243    bool
244    negedge() const
245    {
246        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
247        return false;
248    }
249
250    sc_event_finder &
251    value_changed() const
252    {
253        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
254        return *(sc_event_finder *)nullptr;
255    }
256    sc_event_finder &
257    pos() const
258    {
259        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
260        return *(sc_event_finder *)nullptr;
261    }
262    sc_event_finder &
263    neg() const
264    {
265        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
266        return *(sc_event_finder *)nullptr;
267    }
268
269    virtual const char *kind() const { return "sc_in"; }
270
271  private:
272    // Disabled
273    sc_in(const sc_in<bool> &) : sc_port<sc_signal_in_if<bool>, 1>() {}
274    sc_in<bool> &operator = (const sc_in<bool> &) { return *this; }
275};
276
277template <>
278inline void
279sc_trace<bool>(sc_trace_file *, const sc_in<bool> &, const std::string &)
280{
281    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
282}
283
284template <>
285class sc_in<sc_dt::sc_logic> :
286    public sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>
287{
288  public:
289    sc_in() : sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>() {}
290    explicit sc_in(const char *name) :
291        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name)
292    {}
293    virtual ~sc_in() {}
294
295    virtual void
296    bind(const sc_signal_in_if<sc_dt::sc_logic> &)
297    {
298        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
299    }
300    void
301    operator () (const sc_signal_in_if<sc_dt::sc_logic> &)
302    {
303        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
304    }
305
306    virtual void
307    bind(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
308    {
309        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
310    }
311    void
312    operator () (sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &)
313    {
314        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
315    }
316
317    virtual void
318    bind(sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
319    {
320        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
321    }
322    void
323    operator () (sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &)
324    {
325        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
326    }
327
328    virtual void
329    end_of_elaboration()
330    {
331        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
332    }
333
334    const sc_dt::sc_logic &
335    read() const
336    {
337        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
338        return *(const sc_dt::sc_logic *)nullptr;
339    }
340    operator const sc_dt::sc_logic& () const
341    {
342        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
343        return *(const sc_dt::sc_logic *)nullptr;
344    }
345
346    const sc_event &
347    default_event() const
348    {
349        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
350        return *(const sc_event *)nullptr;
351    }
352    const sc_event &
353    value_changed_event() const
354    {
355        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
356        return *(const sc_event *)nullptr;
357    }
358    const sc_event &
359    posedge_event() const
360    {
361        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
362        return *(const sc_event *)nullptr;
363    }
364    const sc_event &
365    negedge_event() const
366    {
367        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
368        return *(const sc_event *)nullptr;
369    }
370
371    bool
372    event() const
373    {
374        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
375        return false;
376    }
377    bool
378    posedge() const
379    {
380        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
381        return false;
382    }
383    bool
384    negedge() const
385    {
386        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
387        return false;
388    }
389
390    sc_event_finder &
391    value_changed() const
392    {
393        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
394        return *(sc_event_finder *)nullptr;
395    }
396    sc_event_finder &
397    pos() const
398    {
399        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
400        return *(sc_event_finder *)nullptr;
401    }
402    sc_event_finder &
403    neg() const
404    {
405        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
406        return *(sc_event_finder *)nullptr;
407    }
408
409    virtual const char *kind() const { return "sc_in"; }
410
411  private:
412    // Disabled
413    sc_in(const sc_in<sc_dt::sc_logic> &) :
414        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>()
415    {}
416    sc_in<sc_dt::sc_logic> &
417    operator = (const sc_in<sc_dt::sc_logic> &)
418    {
419        return *this;
420    }
421};
422
423template <>
424inline void
425sc_trace<sc_dt::sc_logic>(
426        sc_trace_file *, const sc_in<sc_dt::sc_logic> &, const std::string &)
427{
428    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
429}
430
431} // namespace sc_core
432
433#endif  //__SYSTEMC_EXT_CHANNEL_SC_IN_HH__
434