dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / HdsdMakefileVisitor.java
diff --git a/dol/src/dol/visitor/hdsd/HdsdMakefileVisitor.java b/dol/src/dol/visitor/hdsd/HdsdMakefileVisitor.java
new file mode 100644 (file)
index 0000000..8458b32
--- /dev/null
@@ -0,0 +1,134 @@
+package dol.visitor.hdsd;
+
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import dol.datamodel.architecture.Processor;
+import dol.datamodel.mapping.Mapping;
+import dol.datamodel.pn.Process;
+import dol.visitor.MapVisitor;
+
+/**
+ *  Visitor that is used to generate
+ *  a HdS package Makefile for a distributed simulation.
+ */
+public class HdsdMakefileVisitor extends MapVisitor {
+
+    /**
+     * Constructor.
+     *
+     * @param dir path of the Makefile
+     */
+    public HdsdMakefileVisitor(String dir) {
+        _dir = dir;
+    }
+
+    /**
+     * Create a Makefile for the given mapping.
+     *
+     * @param x mapping that needs to be rendered.
+     */
+    public void visitComponent(Mapping x) {
+        try {
+            String filename = _dir + "/" + "Makefile";
+            OutputStream file = new FileOutputStream(filename);
+            PrintStream ps = new PrintStream(file);
+
+            ps.println("CXX = g++");
+            ps.println("CC = g++");
+            ps.println();
+            ps.println("PREPROC_MACROS = -D __DOL_ETHZ_GEN__ -DINCLUDE_PROFILER");
+            ps.println();
+            ps.println("SYSTEMC_INC = -I" + _ui.getSystemCINC());
+            ps.println("SYSTEMC_LIB = " + _ui.getSystemCLIB());
+            ps.println("MY_LIB_INC = -Ilib -Iscd -Isc_wrappers -Iprocesses");
+            ps.println("VPATH = lib:scd:scd/fsm:sc_wrappers:processes");
+            ps.println();
+            ps.println("# append '-rdynamic' for name resolution in exception stack traces");
+            ps.println("# append '-g' for debugging");
+            ps.println("CXXFLAGS = -O0 $(PREPROC_MACROS) $(SYSTEMC_INC) $(MY_LIB_INC)");
+            ps.println("CFLAGS = $(CXXFLAGS)");
+            ps.println();
+            
+            // scd library objects
+            ps.println("# scd library objects");
+            ps.println("SCD_OBJS = scd_logging.o scd_exception.o scd_socket.o scd_sock_poller.o \\");
+            ps.println("\tscd_init_listener.o scd_in_connector.o scd_out_connector.o \\");
+            ps.println("\tscd_command.o scd_command_reader.o scd_command_writer.o \\");
+            ps.println("\tscd_simulator.o scd_chan_man.o scd_chan_wrapper.o \\");
+            ps.println("\tscd_cont_man_master.o scd_cont_man_slave.o scd_cont_slave_wrapper.o \\");
+            ps.println("\tscd_rem_fifo_in.o scd_rem_fifo_out.o scd_cont_fsm.o \\");
+            ps.println("\tscd_sts_base.o scd_sts_init.o scd_sts_busy.o scd_sts_idle.o \\");
+            ps.println("\tscd_sts_done.o scd_sts_time_ack.o scd_sts_time.o scd_sts_term_ack.o \\");
+            ps.println("\tscd_sts_terminated.o scd_sts_fail.o scd_sts_failed.o \\");
+            ps.println("\tscd_stm_base.o scd_stm_init.o scd_stm_busy.o scd_stm_idle.o \\");
+            ps.println("\tscd_stm_done.o scd_stm_time_req.o scd_stm_time.o scd_stm_term_req.o \\");
+            ps.println("\tscd_stm_terminate.o scd_stm_terminated.o \\");
+            ps.println("\tscd_stm_fail.o scd_stm_failed.o \\");
+            ps.println("\tscd_stsw_base.o scd_stsw_init.o scd_stsw_busy.o \\");
+            ps.println("\tscd_stsw_idle.o scd_stsw_done.o scd_stsw_time_req.o \\");
+            ps.println("\tscd_stsw_time_ack.o scd_stsw_term_req.o scd_stsw_term_ack.o \\");
+            ps.println("\tscd_stsw_terminate.o scd_stsw_terminated.o \\");
+            ps.println("\tscd_stsw_fail.o scd_stsw_failed.o");
+            ps.println();
+            
+            // process objects
+            ps.println("# process objects");
+            ps.print("PROCESS_OBJS = dol.o ");
+            Iterator<Process> i = x.getProcessList().iterator();
+            Set<String> pSet = new HashSet<String>();
+            while (i.hasNext()) {
+                String basename = i.next().getBasename();
+                if (pSet.add(basename))
+                    ps.print(basename + "_wrapper.o ");
+            }
+            ps.println();
+            ps.println();
+            
+            // target all
+            Iterator<Processor> iter = x.getProcessorList().iterator();
+            String processorList = new String();
+            while (iter.hasNext())
+            {
+                Processor p = iter.next();
+                if (x.getProcessList().isEmpty())
+                    continue;
+                processorList += " scd_" + p.getName();
+            }
+            ps.println("all:" + processorList);
+            ps.println();
+            
+            // processor targets
+            iter = x.getProcessorList().iterator();
+            while (iter.hasNext())
+            {
+                Processor p = iter.next();
+                if (x.getProcessList().isEmpty())
+                    continue;
+                ps.println("scd_" + p.getName() + ": scd_"
+                        + p.getName() + ".o $(PROCESS_OBJS)" 
+                        + " $(SCD_OBJS)");
+                ps.println("\t$(CXX) $(CXXFLAGS) -o $@ $^ $(SYSTEMC_LIB)");
+                ps.println();
+            }
+            
+            // clean target
+            ps.println("clean:");
+            ps.println("\t-rm -f *.o core core.* *.core" + processorList);
+
+        } catch (Exception e) {
+            System.out.println("HdsdMakefileVisitor: exception occured: "
+                    + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    protected String _dir = null;
+}
+