dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hds / HdsProcessVisitor.java
diff --git a/dol/src/dol/visitor/hds/HdsProcessVisitor.java b/dol/src/dol/visitor/hds/HdsProcessVisitor.java
new file mode 100644 (file)
index 0000000..3912408
--- /dev/null
@@ -0,0 +1,232 @@
+/* $Id: HdsProcessVisitor.java 1 2010-02-24 13:03:05Z haidw $$ */
+package dol.visitor.hds;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Vector;
+
+import dol.datamodel.pn.Channel;
+import dol.datamodel.pn.Port;
+import dol.datamodel.pn.Process;
+import dol.datamodel.pn.ProcessNetwork;
+import dol.datamodel.pn.SourceCode;
+import dol.util.CodePrintStream;
+import dol.util.Sed;
+import dol.visitor.PNVisitor;
+
+/**
+ * This class is a class for a visitor that is used to generate
+ * a wrapper class for a process: process_wrapper.[h/cpp].
+ */
+public class HdsProcessVisitor extends PNVisitor {
+
+    /**
+     * Constructor.
+     *
+     * @param dir target directory
+     */
+    public HdsProcessVisitor(String dir) {
+        _dir = dir;
+    }
+
+    /**
+     *
+     * @param x process network that needs to be rendered
+     */
+    public void visitComponent(ProcessNetwork x) {
+        try {
+            Vector<String> pList = new Vector<String>();
+
+            for (Process p : x.getProcessList()) {
+                String basename = p.getBasename();
+                if (!pList.contains(basename)) {
+                    pList.add(basename);
+                    p.accept(this);
+                }
+            }
+        }
+        catch (Exception e) {
+            System.out.println("Process Visitor: exception "
+                    + "occured: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     * @param p process that needs to be rendered
+     */
+    public void visitComponent(Process p) {
+        try {
+            _createCppFile(p);
+            _createHeaderFile(p);
+            _adaptSources(p);
+        }
+        catch (Exception e) {
+            System.out.println("Process Visitor: exception "
+                    + "occured: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     */
+    protected void _adaptSources(Process p) throws IOException {
+        Sed sed = new Sed();
+        for (Port port : p.getPortList()) {
+            String processHeaderFile;
+
+            for (SourceCode sr : p.getSrcList()) {
+                processHeaderFile = _dir + _delimiter + ".."
+                        + _delimiter + "processes" + _delimiter
+                        + sr.getLocality().
+                        replaceAll("(.*)\\.[cC][pP]*[pP]*", "$1\\.h");
+
+                if (port.isOutPort()) {
+                    sed.sed(processHeaderFile,
+                            "(#define[ ]+PORT_\\w*[ ]+)\"?"
+                            + port.getBasename() + "\"?",
+                            "$1 " + "((static_cast<" + p.getBasename()
+                            + "_wrapper *>(p->wptr))->OUTPORT_"
+                            + port.getBasename() + ")");
+
+                }
+                else if (port.isInPort()) {
+                    sed.sed(processHeaderFile,
+                            "(#define[ ]+PORT_\\w*[ ]+)\"?"
+                            + port.getBasename() + "\"?",
+                            "$1 " + "((static_cast<" + p.getBasename()
+                            + "_wrapper *>(p->wptr))->INPORT_"
+                            + port.getBasename() + ")");
+                }
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    protected void _createCppFile(Process p) throws IOException {
+        String filename = _dir + _delimiter + p.getBasename()
+                + "_wrapper.cpp";
+        OutputStream file = new FileOutputStream(filename);
+        CodePrintStream ps = new CodePrintStream(file);
+
+        String newline = System.getProperty("line.separator");
+        String code = "#include \"" + p.getBasename() + "_wrapper.h\""
+                + newline;
+        for (SourceCode sr : p.getSrcList()) {
+            code += "#include \"" + sr.getLocality() + "\"" + newline;
+        }
+        /*
+        for (SourceCode sr : p.getSrcList()) {
+            code += "#include \"" + sr.getLocality().substring(0,
+                    sr.getLocality().lastIndexOf(".") + 1) + "h\""
+                    + newline;
+        }
+        */
+        
+        code += newline;
+
+        code += p.getBasename() + "_wrapper::"
+                + p.getBasename() + "_wrapper(char* name)"
+                + newline;
+        code += "        : ProcessWrapper(name) {" + newline;
+        code += "    _state = (LocalState)new "
+                + p.getBasename().substring(0, 1).toUpperCase()
+                + p.getBasename().substring(1) + "_State;"
+                + newline;
+        code += "    _process.local = _state;"  + newline; 
+        code += "    _process.init = " + p.getBasename() + "_init;"
+                + newline;
+        code += "    _process.fire = " + p.getBasename() + "_fire;"
+        + newline;
+        code += "    _process.wptr = this;" + newline;
+        code += "}" + newline + newline;
+
+        code += p.getBasename() + "_wrapper::~" + p.getBasename()
+                + "_wrapper() {" + newline;
+        code += "    if (_state)" + newline;
+        code += "        delete ("
+                + p.getBasename().substring(0, 1).toUpperCase()
+                + p.getBasename().substring(1) + "_State*)_state;"
+                + newline;
+        code += "}" + newline;
+        ps.printPrefixln(code);
+    }
+
+    protected void _createHeaderFile(Process p)
+        throws IOException {
+        String filename = _dir + _delimiter + p.getBasename()
+                + "_wrapper.h";
+        OutputStream file = new FileOutputStream(filename);
+        CodePrintStream ps = new CodePrintStream(file);
+
+        String newline = System.getProperty("line.separator");
+        String code = "#ifndef " + p.getBasename() + "_WRAPPER_H"
+                + newline;
+        code += "#define " + p.getBasename() + "_WRAPPER_H" + newline
+                + newline;
+        code += "#include \"ProcessWrapper.h\"" + newline; 
+        code += "#include \"dolSupport.h\"" + newline;
+        code += newline;
+
+        code += "class " + p.getBasename() + "_wrapper : "
+                + "public ProcessWrapper {" + newline;
+        code += "    public:" + newline;
+        code += "        " + p.getBasename()
+                + "_wrapper(char* name);" + newline;
+        code += "        virtual ~" + p.getBasename() + "_wrapper();"
+                + newline;
+
+        Vector<String> portList = new Vector<String>();
+        for (Port port : p.getPortList()) {
+            String basename = port.getBasename();
+
+            if (!portList.contains(basename)) {
+                portList.add(basename);
+
+                if (((Channel)port.getPeerResource()).getType().
+                        equals("wfifo")) {
+                    code += "        WindowedFifo *";      
+                } else {
+                    code += "        Fifo *";
+                }
+                if (!port.getRange().equals("")) {
+                    if (port.isOutPort()) {
+                        code += "OUTPORT_"
+                                + port.getBasename() + "["
+                                + port.getRange().replaceAll(
+                                ";", "\\]\\[") + "];" + newline;
+                    }
+                    else if (port.isInPort()) {
+                        code += "INPORT_"
+                                + port.getBasename() + "["
+                                + port.getRange().replaceAll(
+                                ";", "\\]\\[") + "];" + newline;
+                    }
+                }
+                else {
+                    if (port.isOutPort()) {
+                        code += "OUTPORT_"
+                                + port.getName() + ";" + newline;
+                    }
+                    else if (port.isInPort()) {
+                        code += "INPORT_"
+                                + port.getName() + ";" + newline;
+                    }
+                }
+            }
+        }
+
+        code += "    protected:" + newline;
+        code += "        LocalState _state;" + newline;
+        code += "};" + newline + newline;
+        code += "#endif";
+        ps.printPrefixln(code);
+    }
+
+    protected String _dir = null;
+}