dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hds / HdsProcessVisitor.java
1 /* $Id: HdsProcessVisitor.java 1 2010-02-24 13:03:05Z haidw $$ */
2 package dol.visitor.hds;
3
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.util.Vector;
8
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;
15 import dol.util.Sed;
16 import dol.visitor.PNVisitor;
17
18 /**
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].
21  */
22 public class HdsProcessVisitor extends PNVisitor {
23
24     /**
25      * Constructor.
26      *
27      * @param dir target directory
28      */
29     public HdsProcessVisitor(String dir) {
30         _dir = dir;
31     }
32
33     /**
34      *
35      * @param x process network that needs to be rendered
36      */
37     public void visitComponent(ProcessNetwork x) {
38         try {
39             Vector<String> pList = new Vector<String>();
40
41             for (Process p : x.getProcessList()) {
42                 String basename = p.getBasename();
43                 if (!pList.contains(basename)) {
44                     pList.add(basename);
45                     p.accept(this);
46                 }
47             }
48         }
49         catch (Exception e) {
50             System.out.println("Process Visitor: exception "
51                     + "occured: " + e.getMessage());
52             e.printStackTrace();
53         }
54     }
55
56     /**
57      *
58      * @param p process that needs to be rendered
59      */
60     public void visitComponent(Process p) {
61         try {
62             _createCppFile(p);
63             _createHeaderFile(p);
64             _adaptSources(p);
65         }
66         catch (Exception e) {
67             System.out.println("Process Visitor: exception "
68                     + "occured: " + e.getMessage());
69             e.printStackTrace();
70         }
71     }
72
73     /**
74      *
75      */
76     protected void _adaptSources(Process p) throws IOException {
77         Sed sed = new Sed();
78         for (Port port : p.getPortList()) {
79             String processHeaderFile;
80
81             for (SourceCode sr : p.getSrcList()) {
82                 processHeaderFile = _dir + _delimiter + ".."
83                         + _delimiter + "processes" + _delimiter
84                         + sr.getLocality().
85                         replaceAll("(.*)\\.[cC][pP]*[pP]*", "$1\\.h");
86
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() + ")");
94
95                 }
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() + ")");
103                 }
104             }
105         }
106     }
107
108     /**
109      *
110      */
111     protected void _createCppFile(Process p) throws IOException {
112         String filename = _dir + _delimiter + p.getBasename()
113                 + "_wrapper.cpp";
114         OutputStream file = new FileOutputStream(filename);
115         CodePrintStream ps = new CodePrintStream(file);
116
117         String newline = System.getProperty("line.separator");
118         String code = "#include \"" + p.getBasename() + "_wrapper.h\""
119                 + newline;
120         for (SourceCode sr : p.getSrcList()) {
121             code += "#include \"" + sr.getLocality() + "\"" + newline;
122         }
123         /*
124         for (SourceCode sr : p.getSrcList()) {
125             code += "#include \"" + sr.getLocality().substring(0,
126                     sr.getLocality().lastIndexOf(".") + 1) + "h\""
127                     + newline;
128         }
129         */
130         
131         code += newline;
132
133         code += p.getBasename() + "_wrapper::"
134                 + p.getBasename() + "_wrapper(char* name)"
135                 + newline;
136         code += "        : ProcessWrapper(name) {" + newline;
137         code += "    _state = (LocalState)new "
138                 + p.getBasename().substring(0, 1).toUpperCase()
139                 + p.getBasename().substring(1) + "_State;"
140                 + newline;
141         code += "    _process.local = _state;"  + newline; 
142         code += "    _process.init = " + p.getBasename() + "_init;"
143                 + newline;
144         code += "    _process.fire = " + p.getBasename() + "_fire;"
145         + newline;
146         code += "    _process.wptr = this;" + newline;
147         code += "}" + newline + newline;
148
149         code += p.getBasename() + "_wrapper::~" + p.getBasename()
150                 + "_wrapper() {" + newline;
151         code += "    if (_state)" + newline;
152         code += "        delete ("
153                 + p.getBasename().substring(0, 1).toUpperCase()
154                 + p.getBasename().substring(1) + "_State*)_state;"
155                 + newline;
156         code += "}" + newline;
157         ps.printPrefixln(code);
158     }
159
160     protected void _createHeaderFile(Process p)
161         throws IOException {
162         String filename = _dir + _delimiter + p.getBasename()
163                 + "_wrapper.h";
164         OutputStream file = new FileOutputStream(filename);
165         CodePrintStream ps = new CodePrintStream(file);
166
167         String newline = System.getProperty("line.separator");
168         String code = "#ifndef " + p.getBasename() + "_WRAPPER_H"
169                 + newline;
170         code += "#define " + p.getBasename() + "_WRAPPER_H" + newline
171                 + newline;
172         code += "#include \"ProcessWrapper.h\"" + newline; 
173         code += "#include \"dolSupport.h\"" + newline;
174         code += newline;
175
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();"
182                 + newline;
183
184         Vector<String> portList = new Vector<String>();
185         for (Port port : p.getPortList()) {
186             String basename = port.getBasename();
187
188             if (!portList.contains(basename)) {
189                 portList.add(basename);
190
191                 if (((Channel)port.getPeerResource()).getType().
192                         equals("wfifo")) {
193                     code += "        WindowedFifo *";      
194                 } else {
195                     code += "        Fifo *";
196                 }
197                 if (!port.getRange().equals("")) {
198                     if (port.isOutPort()) {
199                         code += "OUTPORT_"
200                                 + port.getBasename() + "["
201                                 + port.getRange().replaceAll(
202                                 ";", "\\]\\[") + "];" + newline;
203                     }
204                     else if (port.isInPort()) {
205                         code += "INPORT_"
206                                 + port.getBasename() + "["
207                                 + port.getRange().replaceAll(
208                                 ";", "\\]\\[") + "];" + newline;
209                     }
210                 }
211                 else {
212                     if (port.isOutPort()) {
213                         code += "OUTPORT_"
214                                 + port.getName() + ";" + newline;
215                     }
216                     else if (port.isInPort()) {
217                         code += "INPORT_"
218                                 + port.getName() + ";" + newline;
219                     }
220                 }
221             }
222         }
223
224         code += "    protected:" + newline;
225         code += "        LocalState _state;" + newline;
226         code += "};" + newline + newline;
227         code += "#endif";
228         ps.printPrefixln(code);
229     }
230
231     protected String _dir = null;
232 }