dol: initial dol commit
[jump.git] / dol / src / dol / visitor / systemC / lib / simple_fifo.h
diff --git a/dol/src/dol/visitor/systemC/lib/simple_fifo.h b/dol/src/dol/visitor/systemC/lib/simple_fifo.h
new file mode 100644 (file)
index 0000000..d11aecf
--- /dev/null
@@ -0,0 +1,182 @@
+/*****************************************************************************
+
+  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 <systemc.h>
+
+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<write_if> 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<read_if> 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;
+}
+*/