sc_in.hh revision 13054:bce8a8124325
14479Sbinkertn@umich.edu/*
24479Sbinkertn@umich.edu * Copyright 2018 Google, Inc.
34479Sbinkertn@umich.edu *
44479Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
54479Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are
64479Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright
74479Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer;
84479Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright
94479Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the
104479Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution;
114479Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its
124479Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from
134479Sbinkertn@umich.edu * this software without specific prior written permission.
144479Sbinkertn@umich.edu *
154479Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
164479Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
174479Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
184479Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
194479Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204479Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
214479Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
224479Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
234479Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
244479Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
254479Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264479Sbinkertn@umich.edu *
274479Sbinkertn@umich.edu * Authors: Gabe Black
284479Sbinkertn@umich.edu */
294479Sbinkertn@umich.edu
304479Sbinkertn@umich.edu#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
314479Sbinkertn@umich.edu#define __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
324479Sbinkertn@umich.edu
334479Sbinkertn@umich.edu#include <string>
344479Sbinkertn@umich.edu
354479Sbinkertn@umich.edu#include "../core/sc_event.hh"
364479Sbinkertn@umich.edu#include "../core/sc_port.hh"
374479Sbinkertn@umich.edu#include "sc_signal_in_if.hh"
384479Sbinkertn@umich.edu#include "sc_signal_inout_if.hh"
394479Sbinkertn@umich.edu#include "warn_unimpl.hh"
404479Sbinkertn@umich.edu
414479Sbinkertn@umich.edunamespace sc_core
424479Sbinkertn@umich.edu{
434479Sbinkertn@umich.edu
444479Sbinkertn@umich.educlass sc_event;
454479Sbinkertn@umich.educlass sc_trace_file;
464479Sbinkertn@umich.edu
474479Sbinkertn@umich.edutemplate <class T>
484479Sbinkertn@umich.educlass sc_in : public sc_port<sc_signal_in_if<T>, 1>
494479Sbinkertn@umich.edu{
504479Sbinkertn@umich.edu  public:
514479Sbinkertn@umich.edu    sc_in() : sc_port<sc_signal_in_if<T>, 1>(),
524479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
534479Sbinkertn@umich.edu    {}
544479Sbinkertn@umich.edu    explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name),
554479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
564479Sbinkertn@umich.edu    {}
574479Sbinkertn@umich.edu    virtual ~sc_in() {}
584479Sbinkertn@umich.edu
594479Sbinkertn@umich.edu    // Deprecated binding constructors.
604479Sbinkertn@umich.edu    explicit sc_in(const sc_signal_in_if<T> &interface) :
614479Sbinkertn@umich.edu        sc_port<sc_signal_in_if<T>, 1>(interface),
624479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
634479Sbinkertn@umich.edu    {}
644479Sbinkertn@umich.edu    sc_in(const char *name, const sc_signal_in_if<T> &interface) :
654479Sbinkertn@umich.edu        sc_port<sc_signal_in_if<T>, 1>(name, interface),
664479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
674479Sbinkertn@umich.edu    {}
684479Sbinkertn@umich.edu    explicit sc_in(sc_port_b<sc_signal_in_if<T> > &parent) :
694479Sbinkertn@umich.edu        sc_port<sc_signal_in_if<T>, 1>(parent),
704479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
714479Sbinkertn@umich.edu    {}
724479Sbinkertn@umich.edu    sc_in(const char *name, sc_port_b<sc_signal_in_if<T> > &parent) :
734479Sbinkertn@umich.edu        sc_port<sc_signal_in_if<T>, 1>(name, parent),
744479Sbinkertn@umich.edu        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
75    {}
76    explicit sc_in(sc_port<sc_signal_in_if<T>, 1> &parent) :
77        sc_port<sc_signal_in_if<T>, 1>(parent),
78        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
79    {}
80    sc_in(const char *name, sc_port<sc_signal_in_if<T>, 1> &parent) :
81        sc_port<sc_signal_in_if<T>, 1>(name, parent),
82        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
83    {}
84
85    virtual void
86    bind(const sc_signal_in_if<T> &i)
87    {
88        sc_port<sc_signal_in_if<T>, 1>::bind(
89                const_cast<sc_signal_in_if<T> &>(i));
90    }
91    void operator () (const sc_signal_in_if<T> &i) { bind(i); }
92
93    virtual void
94    bind(sc_port<sc_signal_in_if<T>, 1> &i)
95    {
96        sc_port<sc_signal_in_if<T>, 1>::bind(i);
97    }
98    void
99    operator () (sc_port<sc_signal_in_if<T>, 1> &p)
100    {
101        bind(p);
102    }
103
104    virtual void
105    bind(sc_port<sc_signal_inout_if<T>, 1> &p)
106    {
107        sc_port_base::bind(p);
108    }
109    void
110    operator () (sc_port<sc_signal_inout_if<T>, 1> &p)
111    {
112        bind(p);
113    }
114
115    virtual void end_of_elaboration() { /* Implementation defined. */ }
116
117    const T &read() const { return (*this)->read(); }
118    operator const T& () const { return (*this)->read(); }
119
120    const sc_event &default_event() const { return (*this)->default_event(); }
121    const sc_event &
122    value_changed_event() const
123    {
124        return (*this)->value_changed_event();
125    }
126    bool event() const { return (*this)->event(); }
127    sc_event_finder &value_changed() const { return _valueChangedFinder; }
128
129    virtual const char *kind() const { return "sc_in"; }
130
131  private:
132    mutable sc_event_finder_t<sc_signal_in_if<T> > _valueChangedFinder;
133
134    // Disabled
135    sc_in(const sc_in<T> &);
136    sc_in<T> &operator = (const sc_in<T> &);
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        _valueChangedFinder(*this,
152                &sc_signal_in_if<bool>::value_changed_event),
153        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
154        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
155    {}
156    explicit sc_in(const char *name) :
157        sc_port<sc_signal_in_if<bool>, 1>(name),
158        _valueChangedFinder(*this,
159                &sc_signal_in_if<bool>::value_changed_event),
160        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
161        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
162    {}
163    virtual ~sc_in() {}
164
165    // Deprecated binding constructors.
166    explicit sc_in(const sc_signal_in_if<bool> &interface) :
167        sc_port<sc_signal_in_if<bool>, 1>(interface),
168        _valueChangedFinder(*this,
169                &sc_signal_in_if<bool>::value_changed_event),
170        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
171        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
172    {}
173    sc_in(const char *name, const sc_signal_in_if<bool> &interface) :
174        sc_port<sc_signal_in_if<bool>, 1>(name, interface),
175        _valueChangedFinder(*this,
176                &sc_signal_in_if<bool>::value_changed_event),
177        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
178        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
179    {}
180    explicit sc_in(sc_port_b<sc_signal_in_if<bool> > &parent) :
181        sc_port<sc_signal_in_if<bool>, 1>(parent),
182        _valueChangedFinder(*this,
183                &sc_signal_in_if<bool>::value_changed_event),
184        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
185        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
186    {}
187    sc_in(const char *name, sc_port_b<sc_signal_in_if<bool> > &parent) :
188        sc_port<sc_signal_in_if<bool>, 1>(name, parent),
189        _valueChangedFinder(*this,
190                &sc_signal_in_if<bool>::value_changed_event),
191        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
192        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
193    {}
194    explicit sc_in(sc_port<sc_signal_in_if<bool>, 1> &parent) :
195        sc_port<sc_signal_in_if<bool>, 1>(parent),
196        _valueChangedFinder(*this,
197                &sc_signal_in_if<bool>::value_changed_event),
198        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
199        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
200    {}
201    sc_in(const char *name, sc_port<sc_signal_in_if<bool>, 1> &parent) :
202        sc_port<sc_signal_in_if<bool>, 1>(name, parent),
203        _valueChangedFinder(*this,
204                &sc_signal_in_if<bool>::value_changed_event),
205        _posFinder(*this, &sc_signal_in_if<bool>::posedge_event),
206        _negFinder(*this, &sc_signal_in_if<bool>::negedge_event)
207    {}
208
209    virtual void
210    bind(const sc_signal_in_if<bool> &i)
211    {
212        sc_port<sc_signal_in_if<bool>, 1>::bind(
213                const_cast<sc_signal_in_if<bool> &>(i));
214    }
215    void operator () (const sc_signal_in_if<bool> &i) { bind(i); }
216
217    virtual void
218    bind(sc_port<sc_signal_in_if<bool>, 1> &p)
219    {
220        sc_port<sc_signal_in_if<bool>, 1>::bind(p);
221    }
222    void
223    operator () (sc_port<sc_signal_in_if<bool>, 1> &p)
224    {
225        bind(p);
226    }
227
228    virtual void
229    bind(sc_port<sc_signal_inout_if<bool>, 1> &p)
230    {
231        sc_port_base::bind(p);
232    }
233    void
234    operator () (sc_port<sc_signal_inout_if<bool>, 1> &p)
235    {
236        bind(p);
237    }
238
239    virtual void end_of_elaboration() { /* Implementation defined. */ }
240
241    const bool &read() const { return (*this)->read(); }
242    operator const bool& () const { return (*this)->read(); }
243
244    const sc_event &default_event() const { return (*this)->default_event(); }
245    const sc_event &
246    value_changed_event() const
247    {
248        return (*this)->value_changed_event();
249    }
250    const sc_event &
251    posedge_event() const
252    {
253        return (*this)->posedge_event();
254    }
255    const sc_event &
256    negedge_event() const
257    {
258        return (*this)->negedge_event();
259    }
260
261    bool event() const { return (*this)->event(); }
262    bool posedge() const { return (*this)->posedge(); }
263    bool negedge() const { return (*this)->negedge(); }
264
265    sc_event_finder &value_changed() const { return _valueChangedFinder; }
266    sc_event_finder &pos() const { return _posFinder; }
267    sc_event_finder &neg() const { return _negFinder; }
268
269    virtual const char *kind() const { return "sc_in"; }
270
271  private:
272    mutable sc_event_finder_t<sc_signal_in_if<bool> > _valueChangedFinder;
273    mutable sc_event_finder_t<sc_signal_in_if<bool> > _posFinder;
274    mutable sc_event_finder_t<sc_signal_in_if<bool> > _negFinder;
275
276    // Disabled
277    sc_in(const sc_in<bool> &);
278    sc_in<bool> &operator = (const sc_in<bool> &);
279};
280
281template <>
282inline void
283sc_trace<bool>(sc_trace_file *, const sc_in<bool> &, const std::string &)
284{
285    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
286}
287
288template <>
289class sc_in<sc_dt::sc_logic> :
290    public sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>
291{
292  public:
293    sc_in() : sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(),
294        _valueChangedFinder(*this,
295                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
296        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
297        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
298    {}
299    explicit sc_in(const char *name) :
300        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name),
301        _valueChangedFinder(*this,
302                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
303        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
304        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
305    {}
306    virtual ~sc_in() {}
307
308    // Deprecated binding constructors.
309    explicit sc_in(const sc_signal_in_if<sc_dt::sc_logic> &interface) :
310        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(interface),
311        _valueChangedFinder(*this,
312                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
313        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
314        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
315    {}
316    sc_in(const char *name,
317            const sc_signal_in_if<sc_dt::sc_logic> &interface) :
318        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, interface),
319        _valueChangedFinder(*this,
320                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
321        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
322        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
323    {}
324    explicit sc_in(sc_port_b<sc_signal_in_if<sc_dt::sc_logic> > &parent) :
325        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
326        _valueChangedFinder(*this,
327                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
328        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
329        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
330    {}
331    sc_in(const char *name,
332            sc_port_b<sc_signal_in_if<sc_dt::sc_logic> > &parent) :
333        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
334        _valueChangedFinder(*this,
335                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
336        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
337        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
338    {}
339    explicit sc_in(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &parent) :
340        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(parent),
341        _valueChangedFinder(*this,
342                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
343        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
344        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
345    {}
346    sc_in(const char *name,
347            sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &parent) :
348        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>(name, parent),
349        _valueChangedFinder(*this,
350                &sc_signal_in_if<sc_dt::sc_logic>::value_changed_event),
351        _posFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::posedge_event),
352        _negFinder(*this, &sc_signal_in_if<sc_dt::sc_logic>::negedge_event)
353    {}
354
355    virtual void
356    bind(const sc_signal_in_if<sc_dt::sc_logic> &i)
357    {
358        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>::bind(
359                const_cast<sc_signal_in_if<sc_dt::sc_logic> &>(i));
360    }
361    void
362    operator () (const sc_signal_in_if<sc_dt::sc_logic> &i) { bind(i); }
363
364    virtual void
365    bind(sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &i)
366    {
367        sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1>::bind(i);
368    }
369    void
370    operator () (sc_port<sc_signal_in_if<sc_dt::sc_logic>, 1> &p)
371    {
372        bind(p);
373    }
374
375    virtual void
376    bind(sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &p)
377    {
378        sc_port_base::bind(p);
379    }
380    void
381    operator () (sc_port<sc_signal_inout_if<sc_dt::sc_logic>, 1> &p)
382    {
383        bind(p);
384    }
385
386    virtual void end_of_elaboration() { /* Implementation defined. */ }
387
388    const sc_dt::sc_logic &read() const { return (*this)->read(); }
389    operator const sc_dt::sc_logic& () const { return (*this)->read(); }
390
391    const sc_event &default_event() const { return (*this)->default_event(); }
392    const sc_event &
393    value_changed_event() const
394    {
395        return (*this)->value_changed_event();
396    }
397    const sc_event &posedge_event() const { return (*this)->posedge_event(); }
398    const sc_event &negedge_event() const { return (*this)->negedge_event(); }
399
400    bool event() const { return (*this)->event(); }
401    bool posedge() const { return (*this)->posedge(); }
402    bool negedge() const { return (*this)->negedge(); }
403
404    sc_event_finder &value_changed() const { return _valueChangedFinder; }
405    sc_event_finder &pos() const { return _posFinder; }
406    sc_event_finder &neg() const { return _negFinder; }
407
408    virtual const char *kind() const { return "sc_in"; }
409
410  private:
411    mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> >
412        _valueChangedFinder;
413    mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _posFinder;
414    mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _negFinder;
415
416    // Disabled
417    sc_in(const sc_in<sc_dt::sc_logic> &);
418    sc_in<sc_dt::sc_logic> &operator = (const sc_in<sc_dt::sc_logic> &);
419};
420
421template <>
422inline void
423sc_trace<sc_dt::sc_logic>(
424        sc_trace_file *, const sc_in<sc_dt::sc_logic> &, const std::string &)
425{
426    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
427}
428
429} // namespace sc_core
430
431#endif  //__SYSTEMC_EXT_CHANNEL_SC_IN_HH__
432