X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Flib%2Fsimple_fifo.h;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Flib%2Fsimple_fifo.h;h=b070b8bd0681a02b1f9db8ce9cb2161a5e152be3;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hdsd/lib/simple_fifo.h b/dol/src/dol/visitor/hdsd/lib/simple_fifo.h new file mode 100644 index 0000000..b070b8b --- /dev/null +++ b/dol/src/dol/visitor/hdsd/lib/simple_fifo.h @@ -0,0 +1,186 @@ +/***************************************************************************** + + The following code is derived, directly or indirectly, from the SystemC + source code Copyright (c) 1996-2004 by all Contributors. + All Rights reserved. + + The contents of this file are subject to the restrictions and limitations + set forth in the SystemC Open Source License Version 2.4 (the "License"); + You may not use this file except in compliance with such restrictions and + limitations. You may obtain instructions on how to receive a copy of the + License at http://www.systemc.org/. Software distributed by Contributors + under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF + ANY KIND, either express or implied. See the License for the specific + language governing rights and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + simple_fifo.cpp -- Simple SystemC 2.0 producer/consumer example. + + From "An Introduction to System Level Modeling in + SystemC 2.0". By Stuart Swan, Cadence Design Systems. + Available at www.systemc.org + + Original Author: Stuart Swan, Cadence Design Systems, 2001-06-18 + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + +#ifndef _SIMPLE_FIFO_H_ +#define _SIMPLE_FIFO_H_ + +#include +using sc_core::sc_interface; +using sc_core::sc_channel; +using sc_core::sc_event; +using sc_core::sc_module_name; + +class write_if : virtual public sc_interface +{ + public: + virtual void write(char) = 0; + virtual void reset() = 0; + virtual int wtest(int) = 0; +}; + +class read_if : virtual public sc_interface +{ + public: + virtual void read(char &) = 0; + virtual int num_available() = 0; + virtual int rtest(int) = 0; +}; + +class fifo : public sc_channel, public write_if, public read_if +{ + public: + fifo(sc_module_name name, int size) + : sc_channel(name), num_elements(0), first(0), max(size) { + data = new char[size]; + } + + void write(char c) { + if (num_elements == max) + wait(read_event); + + data[(first + num_elements) % max] = c; + ++ num_elements; + write_event.notify(); + } + + void read(char &c){ + if (num_elements == 0) + wait(write_event); + + c = data[first]; + -- num_elements; + first = (first + 1) % max; + read_event.notify(); + } + + int rtest(int size) { return (size <= num_elements) ? 1 : 0; } + int wtest(int size) { return (size <= max - num_elements) ? 1 : 0; } + + + void reset() { num_elements = first = 0; } + + int num_available() { return num_elements;} + + private: + int max; + char *data; + int num_elements, first; + sc_event write_event, read_event; +}; + + +#endif + +/* +class producer : public sc_module +{ + public: + sc_port out; + + SC_HAS_PROCESS(producer); + + producer(sc_module_name name) : sc_module(name) + { + SC_THREAD(main); + } + + void main() + { + const char *str = + "Visit www.systemc.org and see what SystemC can do for you today!\n"; + + while (*str) + out->write(*str++); + } +}; + +class consumer : public sc_module +{ + public: + sc_port in; + + SC_HAS_PROCESS(consumer); + + consumer(sc_module_name name) : sc_module(name) + { + SC_THREAD(main); + } + + void main() + { + char c; + cout << endl << endl; + + while (true) { + in->read(c); + cout << c << flush; + + if (in->num_available() == 1) + cout << "<1>" << flush; + if (in->num_available() == 9) + cout << "<9>" << flush; + } + } +}; + +class top : public sc_module +{ + public: + fifo *fifo_inst; + producer *prod_inst; + consumer *cons_inst; + + top(sc_module_name name) : sc_module(name) + { + fifo_inst = new fifo("Fifo1"); + + prod_inst = new producer("Producer1"); + prod_inst->out(*fifo_inst); + + cons_inst = new consumer("Consumer1"); + cons_inst->in(*fifo_inst); + } +}; + +int sc_main (int argc , char *argv[]) { + top top1("Top1"); + sc_start(-1); + return 0; +} +*/