X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhds%2FHdsProcessVisitor.java;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhds%2FHdsProcessVisitor.java;h=3912408e15c63dfbd3fa0ad1a5d0f9d3f1bb8d01;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hds/HdsProcessVisitor.java b/dol/src/dol/visitor/hds/HdsProcessVisitor.java new file mode 100644 index 0000000..3912408 --- /dev/null +++ b/dol/src/dol/visitor/hds/HdsProcessVisitor.java @@ -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 pList = new Vector(); + + 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 portList = new Vector(); + 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; +}