sc_in.hh revision 13054
12SN/A/*
29235Sandreas.hansson@arm.com * Copyright 2018 Google, Inc.
39235Sandreas.hansson@arm.com *
49235Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
59235Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
69235Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
79235Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
89235Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
99235Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
109235Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
119235Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
129235Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
139235Sandreas.hansson@arm.com * this software without specific prior written permission.
141762SN/A *
152SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262SN/A *
272SN/A * Authors: Gabe Black
282SN/A */
292SN/A
302SN/A#ifndef __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
312SN/A#define __SYSTEMC_EXT_CHANNEL_SC_IN_HH__
322SN/A
332SN/A#include <string>
342SN/A
352SN/A#include "../core/sc_event.hh"
362SN/A#include "../core/sc_port.hh"
372SN/A#include "sc_signal_in_if.hh"
382SN/A#include "sc_signal_inout_if.hh"
392665SN/A#include "warn_unimpl.hh"
402665SN/A
412665SN/Anamespace sc_core
429235Sandreas.hansson@arm.com{
432SN/A
442SN/Aclass sc_event;
459235Sandreas.hansson@arm.comclass sc_trace_file;
469235Sandreas.hansson@arm.com
472SN/Atemplate <class T>
489235Sandreas.hansson@arm.comclass sc_in : public sc_port<sc_signal_in_if<T>, 1>
499235Sandreas.hansson@arm.com{
509235Sandreas.hansson@arm.com  public:
512SN/A    sc_in() : sc_port<sc_signal_in_if<T>, 1>(),
522SN/A        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
539235Sandreas.hansson@arm.com    {}
542SN/A    explicit sc_in(const char *name) : sc_port<sc_signal_in_if<T>, 1>(name),
559235Sandreas.hansson@arm.com        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
569235Sandreas.hansson@arm.com    {}
579235Sandreas.hansson@arm.com    virtual ~sc_in() {}
589235Sandreas.hansson@arm.com
599235Sandreas.hansson@arm.com    // Deprecated binding constructors.
609235Sandreas.hansson@arm.com    explicit sc_in(const sc_signal_in_if<T> &interface) :
619235Sandreas.hansson@arm.com        sc_port<sc_signal_in_if<T>, 1>(interface),
629235Sandreas.hansson@arm.com        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
639235Sandreas.hansson@arm.com    {}
649235Sandreas.hansson@arm.com    sc_in(const char *name, const sc_signal_in_if<T> &interface) :
659235Sandreas.hansson@arm.com        sc_port<sc_signal_in_if<T>, 1>(name, interface),
669235Sandreas.hansson@arm.com        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
671106SN/A    {}
68532SN/A    explicit sc_in(sc_port_b<sc_signal_in_if<T> > &parent) :
69532SN/A        sc_port<sc_signal_in_if<T>, 1>(parent),
709235Sandreas.hansson@arm.com        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
71531SN/A    {}
72531SN/A    sc_in(const char *name, sc_port_b<sc_signal_in_if<T> > &parent) :
732SN/A        sc_port<sc_signal_in_if<T>, 1>(name, parent),
74531SN/A        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
759235Sandreas.hansson@arm.com    {}
76531SN/A    explicit sc_in(sc_port<sc_signal_in_if<T>, 1> &parent) :
779235Sandreas.hansson@arm.com        sc_port<sc_signal_in_if<T>, 1>(parent),
782SN/A        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
79531SN/A    {}
80531SN/A    sc_in(const char *name, sc_port<sc_signal_in_if<T>, 1> &parent) :
81531SN/A        sc_port<sc_signal_in_if<T>, 1>(name, parent),
82531SN/A        _valueChangedFinder(*this, &sc_signal_in_if<T>::value_changed_event)
83531SN/A    {}
84531SN/A
859235Sandreas.hansson@arm.com    virtual void
86531SN/A    bind(const sc_signal_in_if<T> &i)
871106SN/A    {
88531SN/A        sc_port<sc_signal_in_if<T>, 1>::bind(
89531SN/A                const_cast<sc_signal_in_if<T> &>(i));
90531SN/A    }
919235Sandreas.hansson@arm.com    void operator () (const sc_signal_in_if<T> &i) { bind(i); }
929235Sandreas.hansson@arm.com
939235Sandreas.hansson@arm.com    virtual void
94531SN/A    bind(sc_port<sc_signal_in_if<T>, 1> &i)
95531SN/A    {
969235Sandreas.hansson@arm.com        sc_port<sc_signal_in_if<T>, 1>::bind(i);
97531SN/A    }
989235Sandreas.hansson@arm.com    void
99531SN/A    operator () (sc_port<sc_signal_in_if<T>, 1> &p)
100531SN/A    {
101531SN/A        bind(p);
102531SN/A    }
103531SN/A
104531SN/A    virtual void
105531SN/A    bind(sc_port<sc_signal_inout_if<T>, 1> &p)
1062SN/A    {
1079235Sandreas.hansson@arm.com        sc_port_base::bind(p);
108531SN/A    }
1099235Sandreas.hansson@arm.com    void
110531SN/A    operator () (sc_port<sc_signal_inout_if<T>, 1> &p)
1112SN/A    {
1129235Sandreas.hansson@arm.com        bind(p);
1139235Sandreas.hansson@arm.com    }
1149235Sandreas.hansson@arm.com
1152SN/A    virtual void end_of_elaboration() { /* Implementation defined. */ }
1169235Sandreas.hansson@arm.com
1179235Sandreas.hansson@arm.com    const T &read() const { return (*this)->read(); }
1189235Sandreas.hansson@arm.com    operator const T& () const { return (*this)->read(); }
1192SN/A
1209235Sandreas.hansson@arm.com    const sc_event &default_event() const { return (*this)->default_event(); }
1219235Sandreas.hansson@arm.com    const sc_event &
1229235Sandreas.hansson@arm.com    value_changed_event() const
1232SN/A    {
1249235Sandreas.hansson@arm.com        return (*this)->value_changed_event();
1252SN/A    }
1269235Sandreas.hansson@arm.com    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