006a08c3d09385b7090d3bdd88574d885aa2fd18
[jump.git] / dol / src / dol / visitor / systemC / SCModuleVisitor.java
1 /* $Id: SCModuleVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
2 package dol.visitor.systemC;
3
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6
7 import dol.datamodel.pn.Channel;
8 import dol.datamodel.pn.Port;
9 import dol.datamodel.pn.Process;
10 import dol.datamodel.pn.ProcessNetwork;
11 import dol.util.CodePrintStream;
12 import dol.visitor.PNVisitor;
13
14 /**
15  * This class is a class for a visitor that is used to generate
16  * the top sc module: sc_applicaion.cpp.
17  */
18 public class SCModuleVisitor extends PNVisitor {
19
20     /**
21      * Constructor.
22      *
23      * @param dir path of this file
24      */
25     public SCModuleVisitor(String dir) {
26         _dir = dir;
27     }
28
29     /**
30      *
31      * @param x process network that needs to be rendered
32      */
33     public void visitComponent(ProcessNetwork x) {
34         try {
35             String filename = _dir + _delimiter + "sc_application.cpp";
36             OutputStream file = new FileOutputStream(filename);
37             _mainPS = new CodePrintStream(file);
38
39             _mainPS.printPrefixln("#include <systemc>");
40             _mainPS.printPrefixln("#include <list>");
41             _mainPS.printPrefixln("#include \"dol_fifo.h\"");
42             _mainPS.printPrefixln("#include \"dol_sched_if.h\"");
43             _mainPS.println();
44
45             for (String basename : x.getProcessBasenames()) {
46                 _mainPS.printPrefixln("#include \"" + basename
47                         + "_wrapper.h\"");
48             }
49             _mainPS.println();
50             _mainPS.printPrefixln("using namespace std;");
51
52             _mainPS.println();
53             _mainPS.printPrefixln("class sc_application : public sc_module ");
54             _mainPS.printLeftBracket();
55
56             _mainPS.printPrefixln("public:");
57             _mainPS.printPrefixln("SC_HAS_PROCESS(sc_application);");
58
59             //declare processes
60             _mainPS.println();
61             for (Process p : x.getProcessList()) {
62                 _mainPS.printPrefixln(p.getBasename() + "_wrapper "
63                         + p.getName() + "_ins"+ ";");
64                 _mainPS.printPrefixln("sc_event " + p.getName()
65                         + "_event;");
66             }
67             _mainPS.println();
68
69             //define the scheduler
70             _mainPS.printPrefixln("sc_event sched_event;");
71             _mainPS.printPrefixln("list<sc_event* > eventList;");
72             _mainPS.printPrefixln("list<sc_event* >::iterator iter;");
73             _mainPS.println();
74
75             //declare channels
76             _mainPS.println();
77             for (Channel p : x.getChannelList()) {
78                 _mainPS.printPrefixln("fifo " + p.getName() + "_ins;");
79             }
80             _mainPS.println();
81
82             //model constructor
83             _mainPS.printPrefixln("sc_application(sc_module_name name)");
84
85             //parameter of constructor
86             _mainPS.printPrefix(":       sc_module(name)");
87             for (Process p : x.getProcessList()) {
88                 _mainPS.println(",");
89                 _mainPS.printPrefix(p.getName() + "_ins(\""
90                         + p.getName() +"\")");
91             }
92
93             if (x.getChannelList().size() > 0) {
94                 for (Channel c : x.getChannelList()) {
95                     _mainPS.println(",");
96                     _mainPS.printPrefix(c.getName() + "_ins("
97                                         + "\"" + c.getName() + "\", "
98                                         + c.getSize() * c.getTokenSize()
99                                         + ")");
100                 }
101             }
102             _mainPS.println("");
103             _mainPS.printLeftBracket();
104             
105             //construtor content
106             //build the network
107             for (Channel p : x.getChannelList()) {
108                 p.accept(this);
109             }
110             _mainPS.println("");
111
112             _mainPS.println("");
113
114             _mainPS.printPrefixln("SC_THREAD(thread_init);");
115             //init thread
116             _mainPS.printPrefixln("SC_THREAD(thread_sched);");
117
118             //declare concurrent non-terminating threads
119             for (Process p : x.getProcessList()) {
120                 _mainPS.printPrefixln("SC_THREAD(thread_" +
121                                       p.getName() + ");");
122             }
123             _mainPS.printRightBracket();
124             _mainPS.println();
125
126             //define scheduler thread
127             _mainPS.printPrefixln("void thread_init()");
128             _mainPS.printLeftBracket();
129             //init
130             for (Process p : x.getProcessList()) {
131                 _mainPS.printPrefixln(p.getName() + "_ins.initialize();");
132             }
133             _mainPS.printRightBracket();
134             _mainPS.println();
135
136
137             //different scheduling algorithm can be put here
138             _mainPS.printPrefixln("void thread_sched()");
139             _mainPS.printLeftBracket();
140             _mainPS.printPrefixln("while (1)");
141             _mainPS.printLeftBracket();
142             _mainPS.printPrefixln("for (iter=eventList.begin(); iter != "
143                     + "eventList.end(); ++iter)");
144             _mainPS.printLeftBracket();
145             _mainPS.printPrefixln("sc_event* e = (*iter);");
146             _mainPS.printPrefixln("notify(*e);");
147             _mainPS.printRightBracket();
148             _mainPS.printPrefixln("eventList.clear();");
149             _mainPS.printPrefixln("wait(sched_event);");
150             _mainPS.printRightBracket();
151             _mainPS.printRightBracket();
152             _mainPS.println();
153
154             //define threads
155             for (Process p : x.getProcessList()) {
156                 p.accept(this);
157             }
158
159             _mainPS.printRightBracket(); // end of class
160             _mainPS.println(";");
161
162             //create and run the simulator
163             _mainPS.printPrefixln("int sc_main (int argc, char *argv[])");
164             _mainPS.printLeftBracket();
165             _mainPS.printPrefixln("sc_report_handler::set_actions(\""
166                     + "/IEEE_Std_1666/deprecated\", SC_DO_NOTHING);");
167             _mainPS.printPrefixln("sc_report::register_id("
168                     + "RP_ID_PARAMETER_PROBLEM, "
169                     + "\"parameter problem\" );");
170
171             //create an instance of the application model
172             //remove potential whitespaces before using the process
173             //network name as a systemc identifier
174             _mainPS.printPrefixln("sc_application my_app_mdl(\""
175                     + x.getName().replaceAll(" ", "")  + "\");");
176             _mainPS.printPrefixln("sc_start(-1,SC_NS);");
177             _mainPS.printPrefixln("return 0;");
178
179             _mainPS.printRightBracket();
180
181         }
182         catch (Exception e) {
183             System.out.println(" SystemC module visitor: exception " +
184                                "occured: " + e.getMessage());
185             e.printStackTrace();
186         }
187     }
188
189     /**
190      * Print a line for the process in the correct format for DOTTY.
191      *
192      * @param x process that needs to be rendered
193      */
194     public void visitComponent(Process x) {
195         _mainPS.printPrefixln("void thread_" + x.getName() + "()");
196         _mainPS.printLeftBracket();
197         _mainPS.printPrefixln("while (!" + x.getName()
198                 + "_ins.isDetached())");
199         _mainPS.printLeftBracket();
200         _mainPS.printPrefixln(x.getName() + "_ins.fire();");
201         _mainPS.printPrefixln("eventList.push_back(&" + x.getName()
202                               + "_event);");
203         _mainPS.printPrefixln("sched_event.notify();");
204         _mainPS.printPrefixln("wait(" + x.getName() + "_event);");
205
206         _mainPS.printRightBracket();
207         _mainPS.printRightBracket();
208     }
209
210     /**
211      *
212      * @param x channel that needs to be rendered
213      */
214     public void visitComponent(Channel x) {
215         for (Port p : x.getPortList()) {
216             if (p.isOutPort()) {
217                 //we get port name from channel
218                 //channel.out == process.in
219                 _mainPS.printPrefixln(p.getPeerResource().getName()
220                         + "_ins.INPORT_" + p.getPeerPort().getName()
221                         + "(" + x.getName() + "_ins);");
222             } else if (p.isInPort()) {
223                 _mainPS.printPrefixln(p.getPeerResource().getName()
224                         + "_ins.OUTPORT_" + p.getPeerPort().getName()
225                         + "(" + x.getName() + "_ins);");
226             }
227         }
228     }
229
230     protected CodePrintStream _mainPS = null;
231     protected String _dir = null;
232 }