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