1 /* $Id: HdsProcessVisitor.java 1 2010-02-24 13:03:05Z haidw $$ */
2 package dol.visitor.hds;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.Vector;
9 import dol.datamodel.pn.Channel;
10 import dol.datamodel.pn.Port;
11 import dol.datamodel.pn.Process;
12 import dol.datamodel.pn.ProcessNetwork;
13 import dol.datamodel.pn.SourceCode;
14 import dol.util.CodePrintStream;
16 import dol.visitor.PNVisitor;
19 * This class is a class for a visitor that is used to generate
20 * a wrapper class for a process: process_wrapper.[h/cpp].
22 public class HdsProcessVisitor extends PNVisitor {
27 * @param dir target directory
29 public HdsProcessVisitor(String dir) {
35 * @param x process network that needs to be rendered
37 public void visitComponent(ProcessNetwork x) {
39 Vector<String> pList = new Vector<String>();
41 for (Process p : x.getProcessList()) {
42 String basename = p.getBasename();
43 if (!pList.contains(basename)) {
50 System.out.println("Process Visitor: exception "
51 + "occured: " + e.getMessage());
58 * @param p process that needs to be rendered
60 public void visitComponent(Process p) {
67 System.out.println("Process Visitor: exception "
68 + "occured: " + e.getMessage());
76 protected void _adaptSources(Process p) throws IOException {
78 for (Port port : p.getPortList()) {
79 String processHeaderFile;
81 for (SourceCode sr : p.getSrcList()) {
82 processHeaderFile = _dir + _delimiter + ".."
83 + _delimiter + "processes" + _delimiter
85 replaceAll("(.*)\\.[cC][pP]*[pP]*", "$1\\.h");
87 if (port.isOutPort()) {
88 sed.sed(processHeaderFile,
89 "(#define[ ]+PORT_\\w*[ ]+)\"?"
90 + port.getBasename() + "\"?",
91 "$1 " + "((static_cast<" + p.getBasename()
92 + "_wrapper *>(p->wptr))->OUTPORT_"
93 + port.getBasename() + ")");
96 else if (port.isInPort()) {
97 sed.sed(processHeaderFile,
98 "(#define[ ]+PORT_\\w*[ ]+)\"?"
99 + port.getBasename() + "\"?",
100 "$1 " + "((static_cast<" + p.getBasename()
101 + "_wrapper *>(p->wptr))->INPORT_"
102 + port.getBasename() + ")");
111 protected void _createCppFile(Process p) throws IOException {
112 String filename = _dir + _delimiter + p.getBasename()
114 OutputStream file = new FileOutputStream(filename);
115 CodePrintStream ps = new CodePrintStream(file);
117 String newline = System.getProperty("line.separator");
118 String code = "#include \"" + p.getBasename() + "_wrapper.h\""
120 for (SourceCode sr : p.getSrcList()) {
121 code += "#include \"" + sr.getLocality() + "\"" + newline;
124 for (SourceCode sr : p.getSrcList()) {
125 code += "#include \"" + sr.getLocality().substring(0,
126 sr.getLocality().lastIndexOf(".") + 1) + "h\""
133 code += p.getBasename() + "_wrapper::"
134 + p.getBasename() + "_wrapper(char* name)"
136 code += " : ProcessWrapper(name) {" + newline;
137 code += " _state = (LocalState)new "
138 + p.getBasename().substring(0, 1).toUpperCase()
139 + p.getBasename().substring(1) + "_State;"
141 code += " _process.local = _state;" + newline;
142 code += " _process.init = " + p.getBasename() + "_init;"
144 code += " _process.fire = " + p.getBasename() + "_fire;"
146 code += " _process.wptr = this;" + newline;
147 code += "}" + newline + newline;
149 code += p.getBasename() + "_wrapper::~" + p.getBasename()
150 + "_wrapper() {" + newline;
151 code += " if (_state)" + newline;
153 + p.getBasename().substring(0, 1).toUpperCase()
154 + p.getBasename().substring(1) + "_State*)_state;"
156 code += "}" + newline;
157 ps.printPrefixln(code);
160 protected void _createHeaderFile(Process p)
162 String filename = _dir + _delimiter + p.getBasename()
164 OutputStream file = new FileOutputStream(filename);
165 CodePrintStream ps = new CodePrintStream(file);
167 String newline = System.getProperty("line.separator");
168 String code = "#ifndef " + p.getBasename() + "_WRAPPER_H"
170 code += "#define " + p.getBasename() + "_WRAPPER_H" + newline
172 code += "#include \"ProcessWrapper.h\"" + newline;
173 code += "#include \"dolSupport.h\"" + newline;
176 code += "class " + p.getBasename() + "_wrapper : "
177 + "public ProcessWrapper {" + newline;
178 code += " public:" + newline;
179 code += " " + p.getBasename()
180 + "_wrapper(char* name);" + newline;
181 code += " virtual ~" + p.getBasename() + "_wrapper();"
184 Vector<String> portList = new Vector<String>();
185 for (Port port : p.getPortList()) {
186 String basename = port.getBasename();
188 if (!portList.contains(basename)) {
189 portList.add(basename);
191 if (((Channel)port.getPeerResource()).getType().
193 code += " WindowedFifo *";
197 if (!port.getRange().equals("")) {
198 if (port.isOutPort()) {
200 + port.getBasename() + "["
201 + port.getRange().replaceAll(
202 ";", "\\]\\[") + "];" + newline;
204 else if (port.isInPort()) {
206 + port.getBasename() + "["
207 + port.getRange().replaceAll(
208 ";", "\\]\\[") + "];" + newline;
212 if (port.isOutPort()) {
214 + port.getName() + ";" + newline;
216 else if (port.isInPort()) {
218 + port.getName() + ";" + newline;
224 code += " protected:" + newline;
225 code += " LocalState _state;" + newline;
226 code += "};" + newline + newline;
228 ps.printPrefixln(code);
231 protected String _dir = null;