1 /* $Id: SCModuleVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
2 package dol.visitor.systemC;
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
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;
15 * This class is a class for a visitor that is used to generate
16 * the top sc module: sc_applicaion.cpp.
18 public class SCModuleVisitor extends PNVisitor {
23 * @param dir path of this file
25 public SCModuleVisitor(String dir) {
31 * @param x process network that needs to be rendered
33 public void visitComponent(ProcessNetwork x) {
35 String filename = _dir + _delimiter + "sc_application.cpp";
36 OutputStream file = new FileOutputStream(filename);
37 _mainPS = new CodePrintStream(file);
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\"");
45 for (String basename : x.getProcessBasenames()) {
46 _mainPS.printPrefixln("#include \"" + basename
50 _mainPS.printPrefixln("using namespace std;");
53 _mainPS.printPrefixln("class sc_application : public sc_module ");
54 _mainPS.printLeftBracket();
56 _mainPS.printPrefixln("public:");
57 _mainPS.printPrefixln("SC_HAS_PROCESS(sc_application);");
61 for (Process p : x.getProcessList()) {
62 _mainPS.printPrefixln(p.getBasename() + "_wrapper "
63 + p.getName() + "_ins"+ ";");
64 _mainPS.printPrefixln("sc_event " + p.getName()
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;");
77 for (Channel p : x.getChannelList()) {
78 _mainPS.printPrefixln("fifo " + p.getName() + "_ins;");
83 _mainPS.printPrefixln("sc_application(sc_module_name name)");
85 //parameter of constructor
86 _mainPS.printPrefix(": sc_module(name)");
87 for (Process p : x.getProcessList()) {
89 _mainPS.printPrefix(p.getName() + "_ins(\""
90 + p.getName() +"\")");
93 if (x.getChannelList().size() > 0) {
94 for (Channel c : x.getChannelList()) {
96 _mainPS.printPrefix(c.getName() + "_ins("
97 + "\"" + c.getName() + "\", "
98 + c.getSize() * c.getTokenSize()
103 _mainPS.printLeftBracket();
107 for (Channel p : x.getChannelList()) {
114 _mainPS.printPrefixln("SC_THREAD(thread_init);");
116 _mainPS.printPrefixln("SC_THREAD(thread_sched);");
118 //declare concurrent non-terminating threads
119 for (Process p : x.getProcessList()) {
120 _mainPS.printPrefixln("SC_THREAD(thread_" +
123 _mainPS.printRightBracket();
126 //define scheduler thread
127 _mainPS.printPrefixln("void thread_init()");
128 _mainPS.printLeftBracket();
130 for (Process p : x.getProcessList()) {
131 _mainPS.printPrefixln(p.getName() + "_ins.initialize();");
133 _mainPS.printRightBracket();
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();
155 for (Process p : x.getProcessList()) {
159 _mainPS.printRightBracket(); // end of class
160 _mainPS.println(";");
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\" );");
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;");
179 _mainPS.printRightBracket();
182 catch (Exception e) {
183 System.out.println(" SystemC module visitor: exception " +
184 "occured: " + e.getMessage());
190 * Print a line for the process in the correct format for DOTTY.
192 * @param x process that needs to be rendered
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()
203 _mainPS.printPrefixln("sched_event.notify();");
204 _mainPS.printPrefixln("wait(" + x.getName() + "_event);");
206 _mainPS.printRightBracket();
207 _mainPS.printRightBracket();
212 * @param x channel that needs to be rendered
214 public void visitComponent(Channel x) {
215 for (Port p : x.getPortList()) {
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);");
230 protected CodePrintStream _mainPS = null;
231 protected String _dir = null;