dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / HdsdMakefileVisitor.java
1 package dol.visitor.hdsd;
2
3
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6 import java.io.PrintStream;
7 import java.util.HashSet;
8 import java.util.Iterator;
9 import java.util.Set;
10
11 import dol.datamodel.architecture.Processor;
12 import dol.datamodel.mapping.Mapping;
13 import dol.datamodel.pn.Process;
14 import dol.visitor.MapVisitor;
15
16 /**
17  *  Visitor that is used to generate
18  *  a HdS package Makefile for a distributed simulation.
19  */
20 public class HdsdMakefileVisitor extends MapVisitor {
21
22     /**
23      * Constructor.
24      *
25      * @param dir path of the Makefile
26      */
27     public HdsdMakefileVisitor(String dir) {
28         _dir = dir;
29     }
30
31     /**
32      * Create a Makefile for the given mapping.
33      *
34      * @param x mapping that needs to be rendered.
35      */
36     public void visitComponent(Mapping x) {
37         try {
38             String filename = _dir + "/" + "Makefile";
39             OutputStream file = new FileOutputStream(filename);
40             PrintStream ps = new PrintStream(file);
41
42             ps.println("CXX = g++");
43             ps.println("CC = g++");
44             ps.println();
45             ps.println("PREPROC_MACROS = -D __DOL_ETHZ_GEN__ -DINCLUDE_PROFILER");
46             ps.println();
47             ps.println("SYSTEMC_INC = -I" + _ui.getSystemCINC());
48             ps.println("SYSTEMC_LIB = " + _ui.getSystemCLIB());
49             ps.println("MY_LIB_INC = -Ilib -Iscd -Isc_wrappers -Iprocesses");
50             ps.println("VPATH = lib:scd:scd/fsm:sc_wrappers:processes");
51             ps.println();
52             ps.println("# append '-rdynamic' for name resolution in exception stack traces");
53             ps.println("# append '-g' for debugging");
54             ps.println("CXXFLAGS = -O0 $(PREPROC_MACROS) $(SYSTEMC_INC) $(MY_LIB_INC)");
55             ps.println("CFLAGS = $(CXXFLAGS)");
56             ps.println();
57             
58             // scd library objects
59             ps.println("# scd library objects");
60             ps.println("SCD_OBJS = scd_logging.o scd_exception.o scd_socket.o scd_sock_poller.o \\");
61             ps.println("\tscd_init_listener.o scd_in_connector.o scd_out_connector.o \\");
62             ps.println("\tscd_command.o scd_command_reader.o scd_command_writer.o \\");
63             ps.println("\tscd_simulator.o scd_chan_man.o scd_chan_wrapper.o \\");
64             ps.println("\tscd_cont_man_master.o scd_cont_man_slave.o scd_cont_slave_wrapper.o \\");
65             ps.println("\tscd_rem_fifo_in.o scd_rem_fifo_out.o scd_cont_fsm.o \\");
66             ps.println("\tscd_sts_base.o scd_sts_init.o scd_sts_busy.o scd_sts_idle.o \\");
67             ps.println("\tscd_sts_done.o scd_sts_time_ack.o scd_sts_time.o scd_sts_term_ack.o \\");
68             ps.println("\tscd_sts_terminated.o scd_sts_fail.o scd_sts_failed.o \\");
69             ps.println("\tscd_stm_base.o scd_stm_init.o scd_stm_busy.o scd_stm_idle.o \\");
70             ps.println("\tscd_stm_done.o scd_stm_time_req.o scd_stm_time.o scd_stm_term_req.o \\");
71             ps.println("\tscd_stm_terminate.o scd_stm_terminated.o \\");
72             ps.println("\tscd_stm_fail.o scd_stm_failed.o \\");
73             ps.println("\tscd_stsw_base.o scd_stsw_init.o scd_stsw_busy.o \\");
74             ps.println("\tscd_stsw_idle.o scd_stsw_done.o scd_stsw_time_req.o \\");
75             ps.println("\tscd_stsw_time_ack.o scd_stsw_term_req.o scd_stsw_term_ack.o \\");
76             ps.println("\tscd_stsw_terminate.o scd_stsw_terminated.o \\");
77             ps.println("\tscd_stsw_fail.o scd_stsw_failed.o");
78             ps.println();
79             
80             // process objects
81             ps.println("# process objects");
82             ps.print("PROCESS_OBJS = dol.o ");
83             Iterator<Process> i = x.getProcessList().iterator();
84             Set<String> pSet = new HashSet<String>();
85             while (i.hasNext()) {
86                 String basename = i.next().getBasename();
87                 if (pSet.add(basename))
88                     ps.print(basename + "_wrapper.o ");
89             }
90             ps.println();
91             ps.println();
92             
93             // target all
94             Iterator<Processor> iter = x.getProcessorList().iterator();
95             String processorList = new String();
96             while (iter.hasNext())
97             {
98                 Processor p = iter.next();
99                 if (x.getProcessList().isEmpty())
100                     continue;
101                 processorList += " scd_" + p.getName();
102             }
103             ps.println("all:" + processorList);
104             ps.println();
105             
106             // processor targets
107             iter = x.getProcessorList().iterator();
108             while (iter.hasNext())
109             {
110                 Processor p = iter.next();
111                 if (x.getProcessList().isEmpty())
112                     continue;
113                 ps.println("scd_" + p.getName() + ": scd_"
114                         + p.getName() + ".o $(PROCESS_OBJS)" 
115                         + " $(SCD_OBJS)");
116                 ps.println("\t$(CXX) $(CXXFLAGS) -o $@ $^ $(SYSTEMC_LIB)");
117                 ps.println();
118             }
119             
120             // clean target
121             ps.println("clean:");
122             ps.println("\t-rm -f *.o core core.* *.core" + processorList);
123
124         } catch (Exception e) {
125             System.out.println("HdsdMakefileVisitor: exception occured: "
126                     + e.getMessage());
127             e.printStackTrace();
128         }
129
130     }
131
132     protected String _dir = null;
133 }
134