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#include <vector> 31 32#include "base/trace.hh" 33 34#include "systemc/ext/systemc" 35 36class Printer : public sc_core::sc_module 37{ 38 public: 39 sc_core::sc_in<const char *> input; 40 41 SC_CTOR(Printer) 42 { 43 SC_THREAD(print); 44 } 45 46 using sc_core::sc_object::print; 47 void 48 print() 49 { 50 int i = 0; 51 while (true) { 52 wait(input.value_changed_event()); 53 DPRINTFN("Word %d: %s\n", i++, input.read()); 54 } 55 } 56}; 57 58class Feeder : public sc_core::sc_module 59{ 60 public: 61 sc_core::sc_in<bool> clk; 62 sc_core::sc_out<const char *> output; 63 64 std::vector<const char *> strings; 65 66 SC_HAS_PROCESS(Feeder); 67 Feeder(sc_core::sc_module_name, std::vector<const char *> _strings) : 68 strings(_strings) 69 { 70 SC_THREAD(feed); 71 sensitive << clk.pos(); 72 } 73 74 void 75 feed() 76 { 77 int i = 0; 78 while (true) { 79 wait(); 80 if (i >= strings.size()) 81 sc_core::sc_stop(); 82 else 83 output = strings[i]; 84 i++; 85 } 86 } 87}; 88 89int 90sc_main(int argc, char *argv[]) 91{ 92 std::vector<const char *> strings; 93 for (int i = 0; i < argc; i++) 94 strings.push_back(argv[i]); 95 96 sc_core::sc_clock clk; 97 sc_core::sc_buffer<const char *> buf; 98 99 Feeder feeder("feeder", strings); 100 feeder.clk(clk); 101 feeder.output(buf); 102 103 Printer printer("printer"); 104 printer.input(buf); 105 106 sc_core::sc_start(); 107 108 return 0; 109} 110