dol: initial dol commit
[jump.git] / dol / src / dol / visitor / rtems / RtemsMakefileVisitor.java
diff --git a/dol/src/dol/visitor/rtems/RtemsMakefileVisitor.java b/dol/src/dol/visitor/rtems/RtemsMakefileVisitor.java
new file mode 100644 (file)
index 0000000..04c617e
--- /dev/null
@@ -0,0 +1,296 @@
+/* $Id: RtemsMakefileVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
+package dol.visitor.rtems;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Vector;
+
+import dol.datamodel.architecture.Architecture;
+import dol.datamodel.mapping.Mapping;
+import dol.datamodel.pn.Process;
+import dol.datamodel.pn.ProcessNetwork;
+import dol.datamodel.pn.Configuration;
+import dol.main.UserInterface;
+import dol.parser.xml.archischema.ArchiXmlParser;
+import dol.parser.xml.mapschema.MapXmlParser;
+import dol.visitor.PNVisitor;
+
+/**
+ *  This class is a class for a visitor that is used to generate
+ *  a RTEMS package Makefile.
+ */
+public class RtemsMakefileVisitor extends PNVisitor {
+
+    /**
+     * Constructor.
+     *
+     * @param dir path of the Makefile
+     */
+    public RtemsMakefileVisitor(String dir) {
+        _dir = dir;
+    }
+
+    /**
+     * Create a Makefile for the given process network.
+     *
+     * @param pn process network
+     */
+    public void visitComponent(ProcessNetwork pn) {
+        try {
+            String filename = _dir + _delimiter + "Makefile";
+            OutputStream file = new FileOutputStream(filename);
+            PrintStream ps = new PrintStream(file);
+
+            _ui = UserInterface.getInstance();
+            if (_ui.getRtemsBSP().equals("pc386")) {
+                ps.println(getPc386Makefile(pn));
+            } else if (_ui.getRtemsBSP().equals("mparm")) {
+                ps.println(getMparmMakefile(pn));
+            }
+        } catch (Exception e) {
+            System.out.println("RtemsMakefileVisitor: exception occured: "
+                    + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Create a makefile for the pc386 board support package.
+     *
+     * @param pn process network
+     * @return makefile for pc386 board support package
+     */
+    protected String getMparmMakefile(ProcessNetwork pn) {
+        String makefile = "";
+        String newline = System.getProperty("line.separator");
+        makefile += "ifndef SWARMDIR" + newline;
+        makefile += "  $(error Fatal error: Undefined SWARMDIR "
+                + "environment variable!)" + newline;
+        makefile += "endif" + newline;
+        makefile += "" + newline;
+        makefile += "ifndef RTEMS_MAKEFILE_PATH" + newline;
+        makefile += "  $(error Fatal error: Undefined "
+                + "RTEMS_MAKEFILE_PATH environment variable!)" + newline;
+        makefile += "endif" + newline;
+        makefile += "" + newline;
+        makefile += "ifdef EXENAME" + newline;
+        makefile += "  EXEC=$(EXENAME).exe" + newline;
+        makefile += "else" + newline;
+        makefile += "  EXEC=app.exe" + newline;
+        makefile += "endif" + newline;
+        makefile += "" + newline;
+        makefile += "PGM=${ARCH}/$(EXEC)" + newline;
+        makefile += "" + newline;
+        makefile += "# optional managers required" + newline;
+        makefile += "MANAGERS=io mp msg signal event region partition";
+        makefile += newline + newline;
+
+        if (_ui.getRtemsBSP().equals("mparm")) {
+            makefile += "# scratchpad queue lib" + newline;
+            makefile += "QUEUELIB=que_lib/lib" + newline;
+            makefile += "SS_SEMAPHORE_LIB_PATH = "
+                    + "${QUEUELIB}/ss_semaphore_lib" + newline;
+            makefile +="SCRATCH_QUEUE_LIB_PATH = "
+                    + "${QUEUELIB}/scratch_queue_lib" + newline;
+            makefile += "SCRATCH_SEMAPHORE_LIB_PATH = "
+                    + "${QUEUELIB}/scratch_semaphore_lib" + newline;
+            makefile += "EXT_INT_LIB_PATH = ${QUEUELIB}/ext_int_lib" + newline;
+        }
+
+        makefile += "" + newline;
+        makefile += "#H_files" + newline;
+        makefile += "H_FILES=buffer_test_io.h" + newline;
+
+        if (_ui.getRtemsBSP().equals("mparm")) {
+            makefile += "H_FILES += system.h tmacros.h" + newline;
+            makefile += newline;
+            makefile += "COMMON_FLAGS += -DMPARM" + newline;
+            makefile += "COMMON_FLAGS += -I$(QUEUELIB)" + newline;
+            makefile += "COMMON_FLAGS += -I$(SS_SEMAPHORE_LIB_PATH)"
+                   + newline;
+            makefile += "COMMON_FLAGS += -I$(SCRATCH_QUEUE_LIB_PATH)"
+                   + newline;
+            makefile += "COMMON_FLAGS += -I$(SCRATCH_SEMAPHORE_LIB_PATH)";
+            makefile += newline;
+            makefile += newline;
+            makefile += "# communication options" + newline;
+            makefile += "COMMON_FLAGS += -DMPARM_SCRATCHPAD_QUEUE"
+                    + newline;
+            makefile+="COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER "
+                    + "-Dshaper_PROCESSOR" + newline;
+            makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER_DMA "
+                    + "-Dshaper_PROCESSOR" + newline;
+            makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER "
+                    + "-Dshaper_PROCESSOR" + newline;
+            makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER_DMA "
+                    + "-Dshaper_PROCESSOR" + newline;
+            makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_SHARDMEM "
+                    + "-Dshaper_PROCESSOR" + newline;
+
+        int shaperProcessorID;
+        if (_ui.getMappingFileName() == null) {
+        shaperProcessorID =  pn.getProcessList().size();
+        } else {
+        ArchiXmlParser archParser = new ArchiXmlParser();
+        Architecture arch = archParser.
+                doParse(_ui.getPlatformFileName());
+        MapXmlParser mappingParser = new MapXmlParser(pn, arch);
+        Mapping  mapping = mappingParser.
+                doParse(_ui.getMappingFileName());
+        shaperProcessorID = mapping.getProcessorList().size();
+        }
+            makefile +="#COMMON_FLAGS += -DQUEUE_BUFF_SHAPER "
+                    + "-Dshaper_PROCESSOR=" + shaperProcessorID + newline;
+
+            makefile += newline;
+            makefile += "LIBFILECXX = "
+                   + "$(SS_SEMAPHORE_LIB_PATH)/ss_semaphore.cpp "
+                   + "$(SCRATCH_QUEUE_LIB_PATH)/scratch_queue.cpp"
+                   + newline;
+            makefile += "VPATH = SCRATCH_QUEUE_LIB_PATH" + newline;
+        }
+
+        makefile += "" + newline;
+        makefile += "# C source names" + newline;
+        if (_ui.getRtemsBSP().equals("pc386")) {
+            makefile += "CSRCS = main.c rtems_process_wrapper.c ";
+            for (String basename : pn.getProcessBasenames()) {
+                makefile += basename + "_wrapper.c ";
+            }
+        }
+        makefile += newline;
+        makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
+        makefile += "COBJS = $(COBJS_:%=%)" + newline;
+        makefile += "" + newline;
+        makefile += "# C++ source names" + newline;
+        makefile += "CXXSRCS = appsupport.c" + newline;
+
+        if (_ui.getRtemsBSP().equals("mparm")) {
+            makefile += "CXXSRCS += main.c traffic_shaping.c "
+                    + "rtems_process_wrapper.c ";
+            Vector<String> pList = new Vector<String>();
+            for (Process p : pn.getProcessList()) {
+                String basename = p.getBasename();
+                if (!pList.contains(basename)) {
+                    makefile += p.getBasename() + "_wrapper.c ";
+                    pList.add(basename);
+                }
+            }
+            makefile += newline;
+            makefile += "CXXSRCS += $(LIBFILECXX)" + newline;
+        }
+
+        makefile += newline;
+        makefile += newline;
+        makefile += "CXXOBJS_ = $(CXXSRCS:.cpp=.o)" + newline;
+        makefile += "CXXOBJS = $(CXXOBJS_:%=%)" + newline;
+        makefile += "" + newline;
+        makefile += "# AS source names" + newline;
+        makefile += "ASSRCS =" + newline;
+        makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
+        makefile += "ASOBJS = $(ASOBJS_:%=%)" + newline;
+        makefile += "" + newline;
+        makefile += "# Libraries" + newline;
+        makefile += "LIBS = -lrtemsall -lc" + newline;
+        makefile += "" + newline;
+        makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
+                + newline;
+        makefile += "include $(RTEMS_CUSTOM)" + newline;
+        makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
+        makefile += "" + newline;
+        makefile += "#CXXFLAGS += -DAUTOSTARTMEASURING" + newline;
+        makefile += "#CXXFLAGS += -DVERBOSE" + newline;
+        makefile += "CXXFLAGS += -I$(SWARMDIR)/core" + newline;
+        makefile += "CFLAGS += -I$(SWARMDIR)/core" + newline;
+
+        if (_ui.getRtemsBSP().equals("mparm")) {
+            makefile += "CXXFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
+            makefile += "CFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
+
+            makefile += newline;
+            makefile += "#### for calibration" + newline;
+            makefile += "CXXFLAGS +=  -Ilib" + newline;
+            makefile += "CXXFLAGS += -D_GLIBCPP_HAVE_WCHAR_H "
+                + "-D_GLIBCPP_HAVE_MBSTATE_T" + newline;
+            makefile += "CXXFLAGS += -DWORKLOAD_EXTRACT" + newline;
+            makefile += "CXXFLAGS += -DPRINTF_TO_DEBUG" + newline;
+        }
+        makefile += "" + newline;
+        makefile += "SRCS=$(H_FILES)" + newline;
+        makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
+        makefile += "" + newline;
+        makefile += "all:    ${ARCH} $(SRCS) $(PGM) " + newline;
+        makefile += "" + newline;
+        makefile += "$(PGM): $(OBJS) " + newline;
+        makefile += "\t$(make-exe)" + newline;
+        makefile += "clean:" + newline;
+        makefile += "\t-rm -f ${SS_SEMAPHORE_LIB_PATH}/*.o " +
+                "${SCRATCH_QUEUE_LIB_PATH}/*.o" + newline;
+
+        return makefile;
+    }
+
+    /**
+     * Create a makefile for the pc386 board support package.
+     *
+     * @param pn process network
+     * @return makefile for pc386 board support package
+     */
+    protected String getPc386Makefile(ProcessNetwork pn) {
+        String makefile = "";
+        String newline = System.getProperty("line.separator");
+        makefile += "EXEC=main.exe" + newline;
+        makefile += "PGM=${ARCH}/$(EXEC)" + newline;
+        makefile += newline;
+        makefile += "# optional managers required" + newline;
+        makefile += "MANAGERS=all" + newline;
+        makefile += newline;
+        makefile += "# C source names" + newline;
+        makefile += "CSRCS = main.c rtems_process_wrapper.c ";
+        for (String basename : pn.getProcessBasenames()) {
+            makefile += basename + "_wrapper.c ";
+        }
+       for (Configuration conf : pn.getCfgList()) {
+           if (conf.getName().equals("EXTERNAL_SRC")) {
+               makefile += conf.getValue();
+           }
+       }
+        makefile += newline;
+        makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
+        makefile += "COBJS = $(COBJS_:%=${ARCH}/%)" + newline;
+        makefile += newline;
+        makefile += "# C++ source names" + newline;
+        makefile += "CXXSRCS =" + newline;
+        makefile += "CXXOBJS_ = $(CXXSRCS:.cc=.o)" + newline;
+        makefile += "CXXOBJS = $(CXXOBJS_:%=${ARCH}/%)" + newline;
+        makefile += newline;
+        makefile += "# AS source names" + newline;
+        makefile += "ASSRCS =" + newline;
+        makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
+        makefile += "ASOBJS = $(ASOBJS_:%=${ARCH}/%)" + newline;
+        makefile += newline;
+        makefile += "# Libraries" + newline;
+        makefile += "LIBS = -lrtemsall -lc ";
+       for (Configuration conf : pn.getCfgList()) {
+           if (conf.getName().equals("DYNAMIC_LINK"))
+               makefile += conf.getValue() + newline;
+       }
+        makefile += newline;
+        makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
+                + newline;
+        makefile += newline;
+        makefile += "include $(RTEMS_CUSTOM)" + newline;
+        makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
+        makefile += newline;
+        makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
+        makefile += newline;
+        makefile += "all:    ${ARCH} $(PGM)" + newline;
+        makefile += newline;
+        makefile += "$(PGM): $(OBJS)" + newline;
+        makefile += "\t$(make-exe)" + newline;
+        return makefile;
+    }
+
+    protected String _dir = null;
+}