1 package dol.visitor.hdsd;
3 import java.io.FileOutputStream;
4 import java.io.IOException;
5 import java.io.OutputStream;
6 import java.util.Vector;
8 import dol.datamodel.pn.Port;
9 import dol.datamodel.pn.Process;
10 import dol.datamodel.pn.ProcessNetwork;
11 import dol.datamodel.pn.SourceCode;
12 import dol.util.CodePrintStream;
14 import dol.visitor.PNVisitor;
17 * Visitor that is used to generate
18 * a wrapper class for a process: process_wrapper.[h/cpp].
20 public class HdsdProcessVisitor extends PNVisitor {
25 * @param dir target directory
27 public HdsdProcessVisitor(String dir) {
33 * @param x process network that needs to be rendered
35 public void visitComponent(ProcessNetwork x) {
37 Vector<String> pList = new Vector<String>();
39 for (Process p : x.getProcessList()) {
40 String basename = p.getBasename();
41 if (!pList.contains(basename)) {
48 System.out.println("Process Visitor: exception "
49 + "occured: " + e.getMessage());
56 * @param p process that needs to be rendered
58 public void visitComponent(Process p) {
65 System.out.println("Process Visitor: exception "
66 + "occured: " + e.getMessage());
74 protected void _adaptSources(Process p) throws IOException {
76 for (Port port : p.getPortList()) {
77 String processHeaderFile;
79 for (SourceCode sr : p.getSrcList()) {
80 processHeaderFile = _dir + _delimiter + ".."
81 + _delimiter + "processes" + _delimiter
83 replaceAll("(.*)\\.[cC][pP]*[pP]*", "$1\\.h");
85 if (port.isOutPort()) {
86 sed.sed(processHeaderFile,
87 "(#define[ ]*PORT_\\w*[ ]*)\"?"
88 + port.getBasename() + "\"?",
89 "$1 " + "&((static_cast<" + p.getBasename()
90 + "_wrapper *>(p->wptr))->OUTPORT_"
91 + port.getBasename() + ")");
94 else if (port.isInPort()) {
95 sed.sed(processHeaderFile,
96 "(#define[ ]*PORT_\\w*[ ]*)\"?"
97 + port.getBasename() + "\"?",
98 "$1 " + "&((static_cast<" + p.getBasename()
99 + "_wrapper *>(p->wptr))->INPORT_"
100 + port.getBasename() + ")");
109 protected void _createCppFile(Process p) throws IOException {
110 String filename = _dir + _delimiter + p.getBasename()
112 OutputStream file = new FileOutputStream(filename);
113 CodePrintStream ps = new CodePrintStream(file);
115 ps.printPrefixln("#include \"" + p.getBasename()
119 //define the write/read
120 if (p.hasOutPorts()) {
121 ps.printPrefixln("static inline int DOL_write(void *port, "
122 + "void *buf, int len, DOLProcess *process)");
123 ps.printLeftBracket();
124 ps.printPrefixln("sc_port<write_if> *write_port = static_cast"
125 + "<sc_port<write_if> *>(port);");
126 ps.printPrefixln("char *str = static_cast<char*>(buf);");
128 /* begin of profiling: write event */
129 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
130 ps.printPrefixln("(static_cast<" + p.getBasename()
131 + "_wrapper *>(process->wptr))" + "->addToProfile(\"w\", port, len);");
132 ps.printPrefixln("#endif");
133 /* end of profiling */
135 ps.printPrefixln("while (len-- > 0) ");
136 ps.printPrefixln(" (*write_port)->write(*str++);");
137 ps.printRightBracket();
139 ps.printPrefixln("static inline int DOL_wtest(void *port, "
140 + "int len, DOLProcess *process)");
141 ps.printLeftBracket();
142 ps.printPrefixln("sc_port<write_if> *write_port = static_cast"
143 + "<sc_port<write_if> *>(port);");
144 ps.printPrefixln("return (*write_port)->wtest(len);");
145 ps.printRightBracket();
148 if (p.hasInPorts()) {
149 ps.printPrefixln("static inline int DOL_read(void *port, "
150 + "void *buf, int len, DOLProcess *process)");
151 ps.printLeftBracket();
152 ps.printPrefixln("sc_port<read_if> *read_port = static_cast"
153 + "<sc_port<read_if> *>(port);");
154 ps.printPrefixln("char *str = static_cast<char*>(buf);");
156 /* begin of profiling: read event */
157 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
158 ps.printPrefixln("(static_cast<" + p.getBasename()
159 + "_wrapper *>(process->wptr))" + "->addToProfile(\"r\", port, len);");
160 ps.printPrefixln("#endif");
161 /* end of profiling */
163 ps.printPrefixln("while (len-- > 0) ");
164 ps.printPrefixln(" (*read_port)->read(*str++);");
165 ps.printRightBracket();
167 ps.printPrefixln("static inline int DOL_rtest(void *port, "
168 + "int len, DOLProcess *process)");
169 ps.printLeftBracket();
170 ps.printPrefixln("sc_port<read_if> *read_port = static_cast"
171 + "<sc_port<read_if> *>(port);");
172 ps.printPrefixln("return (*read_port)->rtest(len);");
173 ps.printRightBracket();
176 ps.printPrefixln("static inline int DOL_detach(DOLProcess *p)");
177 ps.printLeftBracket();
178 ps.printPrefixln("(static_cast<" + p.getBasename()
179 + "_wrapper *>(p->wptr))" + "->setDetached();");
180 ps.printRightBracket();
183 ps.printPrefixln("#define GETINDEX(dimension) \\");
184 ps.printPrefixln("(static_cast<" + p.getBasename()
185 + "_wrapper *>(p->wptr))->_processIndex[dimension]");
188 for (SourceCode sr : p.getSrcList()) {
189 ps.printPrefixln("#include \"" + sr.getLocality() + "\"");
193 /* begin of profiling: function that adds an entry to the profile */
194 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
195 ps.printPrefixln("void " + p.getBasename() + "_wrapper::addToProfile(const char *evnt, void *port, int length)");
196 ps.printLeftBracket();
197 ps.printPrefixln("if (profiler_output_file != NULL) fprintf(profiler_output_file, \"%u %s %s %p %d\\n\", profiler_event_counter++, _uniqueName, evnt, port, length);");
198 ps.printRightBracket();
199 ps.printPrefixln("#endif");
200 /* end of profiling */
202 ps.printPrefixln("void " + p.getBasename()
203 + "_wrapper::setDetached() { _detached = 1; }");
204 ps.printPrefixln("int " + p.getBasename()
205 + "_wrapper::isDetached() { return _detached; }");
209 ps.printPrefixln(p.getBasename() + "_wrapper::" + p.getBasename()
210 + "_wrapper(sc_module_name name=sc_gen_unique_name(\""
211 + p.getBasename() + "\" )) : sc_module(name), _process("
212 + p.getBasename() + ")" + ", _detached(0)");
213 ps.printLeftBracket();
214 ps.printPrefixln("struct _local_states *_state = "
215 + "new struct _local_states;");
216 ps.printPrefixln("memcpy(_state, " + p.getBasename()
217 + ".local, sizeof(struct _local_states));");
218 ps.printPrefixln("_process.local = _state;");
219 //ps.printPrefixln("sprintf(_process.local->id, name);");
220 ps.printPrefixln("_process.wptr = this;");
222 ps.printPrefixln("char buffer[255];");
223 ps.printPrefixln("sprintf(buffer, name);");
225 /* begin of profiling: save unique name for writing it to
227 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
228 ps.printPrefixln("sprintf(_uniqueName, name);");
229 ps.printPrefixln("#endif");
230 /* end of profiling */
232 ps.printPrefixln("for (int i = 0; i < 4; i++)");
233 ps.printPrefixln(" _processIndex[i] = "
234 + "getIndex(buffer, \"_\", i);");
237 ps.printRightBracket();
240 ps.printPrefixln("void " + p.getBasename()
241 + "_wrapper::initialize()");
242 ps.printLeftBracket();
243 ps.printPrefixln("_process.init(&_process);");
244 ps.printRightBracket();
246 ps.printPrefixln("int " + p.getBasename() + "_wrapper::fire()");
247 ps.printLeftBracket();
249 ps.printPrefixln("return _process.fire(&_process);");
250 ps.printRightBracket();
253 protected void _createHeaderFile(Process p)
255 String filename = _dir + _delimiter + p.getBasename()
257 OutputStream file = new FileOutputStream(filename);
258 CodePrintStream ps = new CodePrintStream(file);
260 ps.printPrefixln("#ifndef " + p.getBasename() + "_WRAPPER_H");
261 ps.printPrefixln("#define " + p.getBasename() + "_WRAPPER_H");
263 ps.printPrefixln("#include \"systemc.h\"");
265 ps.printPrefixln("#include \"dol_sched_if.h\"");
266 ps.printPrefixln("#include \"simple_fifo.h\"");
268 ps.printPrefixln("#include <dol.h>");
271 /* begin of profiling: externally defined global variables */
273 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
274 ps.printPrefixln("extern FILE *profiler_output_file;");
275 ps.printPrefixln("extern unsigned int profiler_event_counter;");
276 ps.printPrefixln("#endif");
278 /* end of profiling */
280 ps.printPrefixln("class " + p.getBasename() +
281 "_wrapper : virtual public dol_sched_if, " +
283 ps.printLeftBracket();
284 ps.printPrefixln("public:");
287 Vector<String> portList = new Vector<String>();
288 for (Port port : p.getPortList()) {
289 String basename = port.getBasename();
291 if (!portList.contains(basename)) {
292 portList.add(basename);
294 if (!port.getRange().equals("")) {
295 if (port.isOutPort()) {
296 ps.printPrefixln("sc_port<write_if> OUTPORT_"
297 + port.getBasename() + "["
298 + port.getRange().replaceAll(
299 ";", "\\]\\[") + "];");
301 else if (port.isInPort()) {
302 ps.printPrefixln("sc_port<read_if> INPORT_"
303 + port.getBasename() + "["
304 + port.getRange().replaceAll(
305 ";", "\\]\\[") + "];");
309 if (port.isOutPort()) {
310 ps.printPrefixln("sc_port<write_if> OUTPORT_"
311 + port.getName() + ";");
313 else if (port.isInPort()) {
314 ps.printPrefixln("sc_port<read_if> INPORT_"
315 + port.getName() + ";");
320 ps.printPrefixln("int _processIndex[4];");
322 /* begin of profiling: name variable declaration */
323 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
324 ps.printPrefixln("char _uniqueName[255];");
325 ps.printPrefixln("#endif");
326 /* end of profiling */
329 ps.printPrefixln("" + p.getBasename()
330 + "_wrapper(sc_module_name name);");
332 ps.printPrefixln("~" + p.getBasename() + "_wrapper() {}");
335 /* begin of profiling: addtoprofile member function */
336 ps.printPrefixln("#ifdef INCLUDE_PROFILER");
337 ps.printPrefixln("void addToProfile(const char *, void *, int);");
338 ps.printPrefixln("#endif");
340 /* end of profiling */
342 ps.printPrefixln("// DOL scheduler interface");
343 ps.printPrefixln("void initialize();");
344 ps.printPrefixln("int fire();");
345 ps.printPrefixln("void setDetached();");
346 ps.printPrefixln("int isDetached();");
349 ps.printPrefixln("protected:");
351 ps.printPrefixln("private:");
352 ps.printPrefixln("" + p.getBasename() + "_wrapper( const "
353 + p.getBasename() + "_wrapper& );");
354 ps.printPrefixln("" + p.getBasename() + "_wrapper& operator = "
355 + "( const " + p.getBasename() + "_wrapper& );");
356 ps.printPrefixln("DOLProcess _process;");
357 ps.printPrefixln("int _detached;");
358 ps.printRightBracket();
359 ps.printPrefixln(";");
360 ps.printPrefixln("#endif");
363 protected String _dir = null;