113373Sgabeblack@google.com/*
213373Sgabeblack@google.com * Copyright 2018 Google, Inc.
313373Sgabeblack@google.com *
413373Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
513373Sgabeblack@google.com * modification, are permitted provided that the following conditions are
613373Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
713373Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
813373Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
913373Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1013373Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1113373Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1213373Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1313373Sgabeblack@google.com * this software without specific prior written permission.
1413373Sgabeblack@google.com *
1513373Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1613373Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1713373Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1813373Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1913373Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2013373Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2113373Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2213373Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2313373Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2413373Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2513373Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2613373Sgabeblack@google.com *
2713373Sgabeblack@google.com * Authors: Gabe Black
2813373Sgabeblack@google.com */
2913373Sgabeblack@google.com
3013373Sgabeblack@google.com#include <vector>
3113373Sgabeblack@google.com
3213373Sgabeblack@google.com#include "base/trace.hh"
3313373Sgabeblack@google.com
3413373Sgabeblack@google.com#include "systemc/ext/systemc"
3513373Sgabeblack@google.com
3613373Sgabeblack@google.comclass Printer : public sc_core::sc_module
3713373Sgabeblack@google.com{
3813373Sgabeblack@google.com  public:
3913373Sgabeblack@google.com    sc_core::sc_in<const char *> input;
4013373Sgabeblack@google.com
4113373Sgabeblack@google.com    SC_CTOR(Printer)
4213373Sgabeblack@google.com    {
4313373Sgabeblack@google.com        SC_THREAD(print);
4413373Sgabeblack@google.com    }
4513373Sgabeblack@google.com
4613498Snikos.nikoleris@arm.com    using sc_core::sc_object::print;
4713373Sgabeblack@google.com    void
4813373Sgabeblack@google.com    print()
4913373Sgabeblack@google.com    {
5013373Sgabeblack@google.com        int i = 0;
5113373Sgabeblack@google.com        while (true) {
5213373Sgabeblack@google.com            wait(input.value_changed_event());
5313373Sgabeblack@google.com            DPRINTFN("Word %d: %s\n", i++, input.read());
5413373Sgabeblack@google.com        }
5513373Sgabeblack@google.com    }
5613373Sgabeblack@google.com};
5713373Sgabeblack@google.com
5813373Sgabeblack@google.comclass Feeder : public sc_core::sc_module
5913373Sgabeblack@google.com{
6013373Sgabeblack@google.com  public:
6113373Sgabeblack@google.com    sc_core::sc_in<bool> clk;
6213373Sgabeblack@google.com    sc_core::sc_out<const char *> output;
6313373Sgabeblack@google.com
6413373Sgabeblack@google.com    std::vector<const char *> strings;
6513373Sgabeblack@google.com
6613373Sgabeblack@google.com    SC_HAS_PROCESS(Feeder);
6713373Sgabeblack@google.com    Feeder(sc_core::sc_module_name, std::vector<const char *> _strings) :
6813373Sgabeblack@google.com        strings(_strings)
6913373Sgabeblack@google.com    {
7013373Sgabeblack@google.com        SC_THREAD(feed);
7113373Sgabeblack@google.com        sensitive << clk.pos();
7213373Sgabeblack@google.com    }
7313373Sgabeblack@google.com
7413373Sgabeblack@google.com    void
7513373Sgabeblack@google.com    feed()
7613373Sgabeblack@google.com    {
7713373Sgabeblack@google.com        int i = 0;
7813373Sgabeblack@google.com        while (true) {
7913373Sgabeblack@google.com            wait();
8013373Sgabeblack@google.com            if (i >= strings.size())
8113373Sgabeblack@google.com                sc_core::sc_stop();
8213373Sgabeblack@google.com            else
8313373Sgabeblack@google.com                output = strings[i];
8413373Sgabeblack@google.com            i++;
8513373Sgabeblack@google.com        }
8613373Sgabeblack@google.com    }
8713373Sgabeblack@google.com};
8813373Sgabeblack@google.com
8913373Sgabeblack@google.comint
9013373Sgabeblack@google.comsc_main(int argc, char *argv[])
9113373Sgabeblack@google.com{
9213373Sgabeblack@google.com    std::vector<const char *> strings;
9313373Sgabeblack@google.com    for (int i = 0; i < argc; i++)
9413373Sgabeblack@google.com        strings.push_back(argv[i]);
9513373Sgabeblack@google.com
9613373Sgabeblack@google.com    sc_core::sc_clock clk;
9713373Sgabeblack@google.com    sc_core::sc_buffer<const char *> buf;
9813373Sgabeblack@google.com
9913373Sgabeblack@google.com    Feeder feeder("feeder", strings);
10013373Sgabeblack@google.com    feeder.clk(clk);
10113373Sgabeblack@google.com    feeder.output(buf);
10213373Sgabeblack@google.com
10313373Sgabeblack@google.com    Printer printer("printer");
10413373Sgabeblack@google.com    printer.input(buf);
10513373Sgabeblack@google.com
10613373Sgabeblack@google.com    sc_core::sc_start();
10713373Sgabeblack@google.com
10813373Sgabeblack@google.com    return 0;
10913373Sgabeblack@google.com}
110