sc_fifo.hh revision 12853
113540Sandrea.mondelli@ucf.edu/*
210107Sradhika.jagtap@ARM.com * Copyright 2018 Google, Inc.
310107Sradhika.jagtap@ARM.com *
410107Sradhika.jagtap@ARM.com * Redistribution and use in source and binary forms, with or without
510107Sradhika.jagtap@ARM.com * modification, are permitted provided that the following conditions are
610107Sradhika.jagtap@ARM.com * met: redistributions of source code must retain the above copyright
710107Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer;
810107Sradhika.jagtap@ARM.com * redistributions in binary form must reproduce the above copyright
910107Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer in the
1010107Sradhika.jagtap@ARM.com * documentation and/or other materials provided with the distribution;
1110107Sradhika.jagtap@ARM.com * neither the name of the copyright holders nor the names of its
1210107Sradhika.jagtap@ARM.com * contributors may be used to endorse or promote products derived from
1310107Sradhika.jagtap@ARM.com * this software without specific prior written permission.
1410107Sradhika.jagtap@ARM.com *
1510107Sradhika.jagtap@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1610107Sradhika.jagtap@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1710107Sradhika.jagtap@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1810107Sradhika.jagtap@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1910107Sradhika.jagtap@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2010107Sradhika.jagtap@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2110107Sradhika.jagtap@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2210107Sradhika.jagtap@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2310107Sradhika.jagtap@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2410107Sradhika.jagtap@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2510107Sradhika.jagtap@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2610107Sradhika.jagtap@ARM.com *
2710107Sradhika.jagtap@ARM.com * Authors: Gabe Black
2810107Sradhika.jagtap@ARM.com */
2910107Sradhika.jagtap@ARM.com
3010107Sradhika.jagtap@ARM.com#ifndef __SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
3110107Sradhika.jagtap@ARM.com#define __SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
3210107Sradhika.jagtap@ARM.com
3310107Sradhika.jagtap@ARM.com#include "../core/sc_module.hh" // for sc_gen_unique_name
3410107Sradhika.jagtap@ARM.com#include "../core/sc_prim.hh"
3510107Sradhika.jagtap@ARM.com#include "sc_fifo_in_if.hh"
3610107Sradhika.jagtap@ARM.com#include "sc_fifo_out_if.hh"
3710107Sradhika.jagtap@ARM.com#include "warn_unimpl.hh"
3810107Sradhika.jagtap@ARM.com
3910107Sradhika.jagtap@ARM.comnamespace sc_core
4010107Sradhika.jagtap@ARM.com{
4110107Sradhika.jagtap@ARM.com
4210107Sradhika.jagtap@ARM.comclass sc_port_base;
4310107Sradhika.jagtap@ARM.comclass sc_event;
4410107Sradhika.jagtap@ARM.com
4510107Sradhika.jagtap@ARM.comtemplate <class T>
4610107Sradhika.jagtap@ARM.comclass sc_fifo : public sc_fifo_in_if<T>,
4710107Sradhika.jagtap@ARM.com                public sc_fifo_out_if<T>,
4810107Sradhika.jagtap@ARM.com                public sc_prim_channel
4910107Sradhika.jagtap@ARM.com{
5010107Sradhika.jagtap@ARM.com  public:
5110107Sradhika.jagtap@ARM.com    explicit sc_fifo(int size=16) :
5210107Sradhika.jagtap@ARM.com            sc_fifo_in_if<T>(), sc_fifo_out_if<T>(),
5310107Sradhika.jagtap@ARM.com            sc_prim_channel(sc_gen_unique_name("fifo"))
5410107Sradhika.jagtap@ARM.com    {}
5510107Sradhika.jagtap@ARM.com    explicit sc_fifo(const char *name, int size=16) :
5610107Sradhika.jagtap@ARM.com            sc_fifo_in_if<T>(), sc_fifo_out_if<T>(),
5710107Sradhika.jagtap@ARM.com            sc_prim_channel(name)
5810107Sradhika.jagtap@ARM.com    {}
5910107Sradhika.jagtap@ARM.com    virtual ~sc_fifo() {}
6010107Sradhika.jagtap@ARM.com
6110107Sradhika.jagtap@ARM.com    virtual void
6210107Sradhika.jagtap@ARM.com    register_port(sc_port_base &, const char *)
6310107Sradhika.jagtap@ARM.com    {
6410107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
6510107Sradhika.jagtap@ARM.com    }
6610107Sradhika.jagtap@ARM.com
6710107Sradhika.jagtap@ARM.com    virtual void
6810107Sradhika.jagtap@ARM.com    read(T &)
6910107Sradhika.jagtap@ARM.com    {
7010107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
7110107Sradhika.jagtap@ARM.com    }
7210107Sradhika.jagtap@ARM.com    virtual T
7310107Sradhika.jagtap@ARM.com    read()
7410269Sradhika.jagtap@ARM.com    {
7510107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
7610107Sradhika.jagtap@ARM.com        return *(T *)nullptr;
7710269Sradhika.jagtap@ARM.com    }
7810269Sradhika.jagtap@ARM.com    virtual bool
7910269Sradhika.jagtap@ARM.com    nb_read(T &)
8010269Sradhika.jagtap@ARM.com    {
8110269Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
8210269Sradhika.jagtap@ARM.com        return false;
8310269Sradhika.jagtap@ARM.com    }
8410269Sradhika.jagtap@ARM.com    operator T()
8510269Sradhika.jagtap@ARM.com    {
8610269Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
8710269Sradhika.jagtap@ARM.com        return *(T *)nullptr;
8810269Sradhika.jagtap@ARM.com    }
8910269Sradhika.jagtap@ARM.com
9010269Sradhika.jagtap@ARM.com    virtual void
9110269Sradhika.jagtap@ARM.com    write(const T &)
9210269Sradhika.jagtap@ARM.com    {
9310269Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
9410269Sradhika.jagtap@ARM.com    }
9510269Sradhika.jagtap@ARM.com    virtual bool
9610269Sradhika.jagtap@ARM.com    nb_write(const T&)
9710269Sradhika.jagtap@ARM.com    {
9810269Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
9910269Sradhika.jagtap@ARM.com        return false;
10010269Sradhika.jagtap@ARM.com    }
10112209Sgabeblack@google.com    sc_fifo<T> &
10210107Sradhika.jagtap@ARM.com    operator = (const T &)
10310107Sradhika.jagtap@ARM.com    {
10410107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
10510107Sradhika.jagtap@ARM.com        return *this;
10610107Sradhika.jagtap@ARM.com    }
10710107Sradhika.jagtap@ARM.com
10810107Sradhika.jagtap@ARM.com    virtual const sc_event &
10910107Sradhika.jagtap@ARM.com    data_written_event() const
11010107Sradhika.jagtap@ARM.com    {
11110107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
11210107Sradhika.jagtap@ARM.com        return *(const sc_event *)nullptr;
11310107Sradhika.jagtap@ARM.com    }
11410107Sradhika.jagtap@ARM.com    virtual const sc_event &
11510107Sradhika.jagtap@ARM.com    data_read_event() const
11610107Sradhika.jagtap@ARM.com    {
11710107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
11810107Sradhika.jagtap@ARM.com        return *(const sc_event *)nullptr;
11910107Sradhika.jagtap@ARM.com    }
12010107Sradhika.jagtap@ARM.com
12110107Sradhika.jagtap@ARM.com    virtual int
12210107Sradhika.jagtap@ARM.com    num_available() const
12310107Sradhika.jagtap@ARM.com    {
12410107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
12510107Sradhika.jagtap@ARM.com        return 0;
12612208Sgabeblack@google.com    }
12712208Sgabeblack@google.com    virtual int
12812208Sgabeblack@google.com    num_free() const
12912208Sgabeblack@google.com    {
13010107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
13110107Sradhika.jagtap@ARM.com        return 0;
13210107Sradhika.jagtap@ARM.com    }
13310107Sradhika.jagtap@ARM.com
13410107Sradhika.jagtap@ARM.com    virtual void
13510107Sradhika.jagtap@ARM.com    print(std::ostream & =std::cout) const
13610107Sradhika.jagtap@ARM.com    {
13712209Sgabeblack@google.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
13810107Sradhika.jagtap@ARM.com    }
13910107Sradhika.jagtap@ARM.com    virtual void
14010107Sradhika.jagtap@ARM.com    dump(std::ostream & =std::cout) const
14110107Sradhika.jagtap@ARM.com    {
14210107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
14310107Sradhika.jagtap@ARM.com    }
14410107Sradhika.jagtap@ARM.com    virtual const char *kind() const { return "sc_fifo"; }
14510107Sradhika.jagtap@ARM.com
14612209Sgabeblack@google.com  protected:
14710107Sradhika.jagtap@ARM.com    virtual void
14810107Sradhika.jagtap@ARM.com    update()
14910107Sradhika.jagtap@ARM.com    {
15010107Sradhika.jagtap@ARM.com        sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
15110107Sradhika.jagtap@ARM.com    }
15210107Sradhika.jagtap@ARM.com
15310107Sradhika.jagtap@ARM.com  private:
15410107Sradhika.jagtap@ARM.com    // Disabled
15512210Sgabeblack@google.com    sc_fifo(const sc_fifo<T> &) :
15610107Sradhika.jagtap@ARM.com            sc_fifo_in_if<T>(), sc_fifo_in_if<T>(), sc_prim_channel()
15710107Sradhika.jagtap@ARM.com    {}
15810107Sradhika.jagtap@ARM.com    sc_fifo &operator = (const sc_fifo<T> &) { return *this; }
15910107Sradhika.jagtap@ARM.com};
16010107Sradhika.jagtap@ARM.com
16110107Sradhika.jagtap@ARM.comtemplate <class T>
16210107Sradhika.jagtap@ARM.cominline std::ostream &
16310107Sradhika.jagtap@ARM.comoperator << (std::ostream &os, const sc_fifo<T> &)
16410107Sradhika.jagtap@ARM.com{
16512209Sgabeblack@google.com    sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
16610107Sradhika.jagtap@ARM.com    return os;
167}
168
169} // namespace sc_core
170
171#endif  //__SYSTEMC_EXT_CHANNEL_SC_FIFO_HH__
172