X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fyapi%2FYapiProcessVisitor.java;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fyapi%2FYapiProcessVisitor.java;h=660f5405d329057dd546be096d241c1ff8e51ae2;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/yapi/YapiProcessVisitor.java b/dol/src/dol/visitor/yapi/YapiProcessVisitor.java new file mode 100644 index 0000000..660f540 --- /dev/null +++ b/dol/src/dol/visitor/yapi/YapiProcessVisitor.java @@ -0,0 +1,309 @@ +/* $Id: YapiProcessVisitor.java 1 2010-02-24 13:03:05Z haidw $ */ +package dol.visitor.yapi; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Vector; + +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; + +/** + * + */ +public class YapiProcessVisitor extends PNVisitor { + + /** + * Constructor. + */ + public YapiProcessVisitor(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 " + "(const_cast((const void*)" + +"(((static_cast<" + p.getBasename() + + "_wrapper *>(p->wptr))->OUTPORT_" + + port.getBasename() + "))))"); + } + else if (port.isInPort()) { + sed.sed(processHeaderFile, + "(#define[ ]*PORT_\\w*[ ]*)\"?" + + port.getBasename() + "\"?", + "$1 " + "(const_cast((const void*)" + +"(((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; + code += "#include \"dolSupport.h\"" + newline; + for (SourceCode sr : p.getSrcList()) { + code += "#include \"" + sr.getLocality() + "\"" + newline; + } + + code += newline; + + code += p.getBasename() + "_wrapper::" + p.getBasename() + + "_wrapper(const char* name, const Id& n"; + for (Port port : p.getPortList()) { + if (port.isInPort()) { + code += ", In& inport_" + port.getName(); + } else { + code += ", Out& outport_" + port.getName(); + } + } + code += ")" + newline; + + code += " : ProcessWrapper(name, n)" + newline; + code += " {" + 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; + for (Port port : p.getPortList()) { + if (!port.getRange().equals("")) { + String portName = + port.getName().replaceAll("_([0-9])", "][$1"); + portName += "]"; + portName = portName.replaceFirst("]", ""); + if (port.isOutPort()) { + code += " OUTPORT_" + portName + + " = new OutPort(id(\"" + port.getName() + + "\"), outport_" + port.getName() + ");" + + newline; + } + else if (port.isInPort()) { + code += " INPORT_" + portName + + " = new InPort(id(\"" + port.getName() + + "\"), inport_" + port.getName() + ");" + + newline; + } + } else { + if (port.isInPort()) { + code += " INPORT_" + port.getName() + + " = new InPort(id(\"" + port.getName() + + "\"), inport_" + port.getName() + ");" + + newline; + } else { + code += " OUTPORT_" + port.getName() + + " = new OutPort(id(\"" + port.getName() + + "\"), outport_" + port.getName() + ");" + + 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; + for (Port port : p.getPortList()) { + if (!port.getRange().equals("")) { + String portName = + port.getName().replaceAll("_([0-9])", "][$1"); + portName += "]"; + portName = portName.replaceFirst("]", ""); + if (port.isOutPort()) { + code += " if (OUTPORT_" + portName + ")" + newline; + code += " delete OUTPORT_" + portName + ";" + + newline; + } + else if (port.isInPort()) { + code += " if (INPORT_" + portName + ")" + newline; + code += " delete INPORT_" + portName + ";" + + newline; + } + } else { + if (port.isInPort()) { + code += " if(INPORT_" + port.getName() + ")" + + newline; + code += " delete INPORT_" + port.getName() + ";" + + newline; + } else { + code += " if(OUTPORT_" + port.getName() + ")" + + newline; + code += " delete OUTPORT_" + port.getName() + ";" + + newline; + } + } + } + code += "}" + newline + newline; + + code += "const char* " + + p.getBasename() + "_wrapper::type() const {" + newline; + code += " return \"" + p.getName() + "\";" + newline; + code += "}" + newline + newline; + + code += "void " + p.getBasename() + "_wrapper::main() {" + newline; + code += " _process.init(&_process);" + newline; + code += " while(!isDetached()) {" + newline; + code += " _process.fire(&_process);" + newline; + code += " }" + 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 += newline; + + code += "class " + p.getBasename() + "_wrapper : " + + "public ProcessWrapper {" + newline; + code += " public:" + newline; + code += " " + p.getBasename() + + "_wrapper(const char* name, const Id& n"; + for (Port port : p.getPortList()) { + if (port.isInPort()) { + code += ", In& inport_" + port.getName(); + } else { + code += ", Out& outport_" + port.getName(); + } + } + code += ");" + newline; + code += " virtual ~" + p.getBasename() + "_wrapper();" + + newline; + code += " const char* type() const;" + newline; + code += " void main();" + newline + newline; + + Vector portList = new Vector(); + for (Port port : p.getPortList()) { + String basename = port.getBasename(); + + if (!portList.contains(basename)) { + portList.add(basename); + + if (!port.getRange().equals("")) { + if (port.isOutPort()) { + code += " OutPort *OUTPORT_" + + port.getBasename() + "[" + + port.getRange().replaceAll( + ";", "\\]\\[") + "];" + newline; + } + else if (port.isInPort()) { + code += " InPort *INPORT_" + + port.getBasename() + "[" + + port.getRange().replaceAll( + ";", "\\]\\[") + "];" + newline; + } + } + else { + if (port.isOutPort()) { + code += " OutPort *OUTPORT_" + + port.getName() + ";" + newline; + } + else if (port.isInPort()) { + code += " InPort *INPORT_" + + port.getName() + ";" + newline; + } + } + } + } + code += newline; + code += " protected:" + newline; + code += " LocalState _state;" + newline; + code += "};" + newline + newline; + code += "#endif"; + ps.printPrefixln(code); + } + + protected String _dir = null; +}