--- /dev/null
+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;
+}
+