dol: initial dol commit
[jump.git] / dol / src / dol / visitor / cell / CellMakefileVisitor.java
1 package dol.visitor.cell;
2
3 import java.io.FileOutputStream;
4 import java.io.OutputStream;
5 import java.io.PrintStream;
6 import java.util.Vector;
7
8 import dol.datamodel.pn.Configuration;
9 import dol.datamodel.pn.Process;
10 import dol.datamodel.pn.ProcessNetwork;
11 import dol.visitor.PNVisitor;
12
13 /**
14  * This class is a class for a visitor that is used to generate a CBE package
15  * Makefile.
16  */
17 public class CellMakefileVisitor extends PNVisitor {
18
19     /**
20      * Constructor.
21      *
22      * @param dir
23      *            path of the Makefile
24      */
25     public CellMakefileVisitor(String dir, CellMapping mapping) {
26         _dir = dir;
27         _mapping = mapping;
28     }
29
30     /**
31      * Create a Makefile for the given process network.
32      *
33      * @param pn
34      *            process network
35      */
36     public void visitComponent(ProcessNetwork pn) {
37         try {
38             String filename = _dir + _delimiter + "Makefile";
39             OutputStream file = new FileOutputStream(filename);
40             PrintStream ps = new PrintStream(file);
41
42             ps.println("####################");
43             ps.println("# Main Makefile for the DOL application on the CBE");
44             ps.println("####################");
45             ps.println();
46             ps.println("# Subdirectories");
47
48
49             // Subdirectories of baseprocesses on the SPU
50             String subdirectories = "";
51             Vector<String> pList = new Vector<String>();
52             for (Process process :  _mapping.getAllSpuBaseProcess()) {
53                 String basename = process.getBasename();
54                 subdirectories += "spu_" + basename + " ";
55             }
56
57             // Directory for the SPU OS'es (only if there are really processes on the SPE!
58             if (_mapping.getNrSPUProcess() > 0)
59                 subdirectories += "spu";
60
61             String srcdirectories = "";
62
63             // Subdirectory of baseprocesses on the PPU
64             for (Process process :  _mapping.getAllPPUBaseProcess()) {
65                 String basename = process.getBasename();
66                 srcdirectories += " $(wildcard ppu_" + basename + "/*.cpp)";
67             }
68
69             // Directory for the PPU OS'es
70             srcdirectories += " $(wildcard ppu/*.cpp)";
71
72             String linkList = "";
73             String srcList = "";
74             for (Process process : _mapping.getAllPPUBaseProcess()) {
75                 String basename = process.getBasename();
76                 linkList += "ppu_" + basename + "/ppu_" + basename + ".o ";
77                 srcList += "$(wildcard ppu_" + basename + "/*.cpp) ";
78             }
79             pList.clear();
80
81             ps.println("DIRS     := " + subdirectories);
82             ps.println("");
83
84             ps.println("# General definitions:");
85             ps.println("CC = ppu-g++");
86             ps.println("CCFLAGS = -ftree-vectorize -O3 -maltivec -funroll-loops -mabi=altivec -mcpu=cell");
87             ps.println("COMPILE = $(CC) $(CCFLAGS) -c");
88             ps.print("LINK = $(CC) -lspe2 -lpthread ");
89             for (Configuration conf : pn.getCfgList()) {
90                 if (conf.getName().equals("DYNAMIC_LINK"))
91                     ps.print(conf.getValue() + " ");
92             }
93             ps.println("");
94
95             ps.println("CBE_INCLUDE = /opt/cell/sdk/usr/include");
96             ps.println("LIB_INC = -I lib -I lib/ppu -I lib/pt -I . -I $(CBE_INCLUDE)");
97             ps.println("RM = rm");
98             ps.println("ECHO = echo");
99             ps.println("EXE = sc_application");
100             ps.println("");
101             ps.println("src := $(wildcard lib/ppu/*.cpp) $(wildcard *.cpp)" + srcdirectories);
102             ps.println("srcAll := $(wildcard lib/ppu/*.cpp) $(wildcard *.cpp) " + srcList);
103             ps.println("srcspu := $(wildcard lib/spu/*.cpp) ");
104             ps.println("obj = $(src:.cpp=.o)");
105             ps.println("objspu = $(srcspu:.cpp=.o)");
106             ps.println("");
107             ps.println("$(EXE): $(obj) $(srcAll)");
108             ps.println("\tfor d in $(DIRS); do (cd $$d; $(MAKE) ); done");
109             ps.println("\t$(LINK) -o $(EXE) $(obj)");
110             ps.println("");
111             ps.println("%.o :");
112             ps.println("\t$(COMPILE) -o $(*D)/$(*F).o $(*D)/$(*F).cpp $(LIB_INC)");
113             ps.println("");
114             ps.println("clean:");
115             ps.println("\tfor d in $(DIRS); do (cd $$d; $(MAKE) clean ); done");
116             ps.println("\trm $(objspu)");
117             ps.println("\trm $(obj) ");
118             ps.println("\trm $(EXE)");
119             ps.println("");
120
121         } catch (Exception e) {
122             System.out.println("CbeMakefileVisitor: exception occured: "
123                     + e.getMessage());
124             e.printStackTrace();
125         }
126     }
127
128     protected String _dir = null;
129     protected CellMapping _mapping;
130 }