#include <systemc>

using namespace sc_core;
using namespace sc_dt;
using namespace std;

SC_MODULE(Producer) {
    sc_fifo_out<char> out;
    SC_CTOR(Producer) {
        SC_THREAD(main);
    }
private:
    void main() {
        for (char c = 'A'; c <= 'Z';  ++c) {
            out.write(c);
        }
    }
};

SC_MODULE(Consumer) {
    sc_fifo_in<char> in;
    SC_CTOR(Consumer) {
        SC_THREAD(main);
    }
private:
    void main() {
        char c;
        do {
            c = in.read();
            cout << "Read: " << c << " number of characters in buffer: " << in.num_available() << endl;
        } while (c != 'Z');
    }
};

SC_MODULE(Top) {
    SC_CTOR(Top): consumer("consumer"), producer("producer"), fifo("fifo", 4) {
        producer.out(fifo);
        consumer.in(fifo);
    }
private:
    sc_fifo<char> fifo;
    Producer producer;
    Consumer consumer;
};

int sc_main(int argc, char *argv[]) {
    Top top("top");
    sc_start();
    cin.get();
    return 0;
}
