dol: initial dol commit
[jump.git] / dol / src / dol / visitor / rtems / RtemsProcessVisitor.java
1 /* $Id: RtemsProcessVisitor.java 213 2010-10-20 09:40:59Z khuang $ */
2 package dol.visitor.rtems;
3
4 import java.io.File;
5 import java.util.HashMap;
6 import java.util.Vector;
7
8 import dol.datamodel.pn.Configuration;
9 import dol.datamodel.pn.Port;
10 import dol.datamodel.pn.Process;
11 import dol.datamodel.pn.ProcessNetwork;
12 import dol.datamodel.pn.SourceCode;
13 import dol.util.Copier;
14 import dol.util.Sed;
15 import dol.visitor.PNVisitor;
16
17 /**
18  * This class is a class for a visitor that is used to generate
19  * a wrapper class for a process.
20  */
21 public class RtemsProcessVisitor extends PNVisitor {
22
23     /**
24      * Constructor.
25      *
26      * @param dir target directory
27      */
28     public RtemsProcessVisitor(String dir,
29                                HashMap<Port, Integer> portMap,
30                                HashMap<Process, Integer> sinkMap) {
31         _dir = dir;
32         _portMap = portMap;
33         _sinkMap = sinkMap;
34     }
35
36     /**
37      *
38      * @param x process network that needs to be processed
39      */
40     public void visitComponent(ProcessNetwork x) {
41         try {
42             Vector<String> pList = new Vector<String>();
43
44             for (Process p : x.getProcessList()) {
45                 String basename = p.getBasename();
46                 if (!pList.contains(basename)) {
47                     pList.add(basename);
48                     p.accept(this);
49                 }
50             }
51         }
52         catch (Exception e) {
53             System.out.println("RtemsProcessVisitor: exception "
54                     + "occured: " + e.getMessage());
55             e.printStackTrace();
56         }
57     }
58
59     /**
60      * Visit process.
61      *
62      * @param p process that needs to be processed
63      */
64     public void visitComponent(Process p) {
65         try {
66             String filename = _dir + _delimiter + p.getBasename()
67                     + "_wrapper.c";
68             File process_file = new File(filename);
69             File pattern_file = new File(_dir + _delimiter
70                     + "process_wrapper_template.c");
71             new Copier().copyFile(pattern_file, process_file);
72
73             String includes = "";
74             for (SourceCode code : p.getSrcList()) {
75                 includes += "#include \"" + code.getLocality() + "\""
76                         + System.getProperty("line.separator");
77             }
78
79             Sed sed = new Sed();
80             sed.sed(filename, "//#include \"@PROCESSNAME@.c\"", includes);
81             sed.sed(filename, "@PROCESSNAME@", p.getBasename());
82             sed.sed(filename, "@Processname@",
83                     p.getBasename().substring(0, 1).toUpperCase() +
84                     p.getBasename().substring(1));
85
86             String triggerPeriod = null;
87             String burstSize = null;
88             String burstPosition = null;
89             for (Configuration c : p.getCfgList()) {
90                 if (c.getName().equals("triggerPeriod")) {
91                     triggerPeriod = c.getValue();
92                 } else if (c.getName().equals("burstSize")) {
93                     burstSize = c.getValue();
94                 } else if (c.getName().equals("burstPosition")) {
95                     burstPosition = c.getValue();
96                 }
97             }
98             if (triggerPeriod != null) {
99                 if (burstSize == null) {
100                     burstSize = "0";
101                 }
102                 if (burstPosition == null) {
103                     burstPosition = "0";
104                 }
105
106                 String periodicTrigger =
107                         "//limits the number of process activations\n"
108                         + "        while ((((int)get_cycle() - "
109                         + "1511576) / " + triggerPeriod + ") "
110                         + "< number_of_activations - (((int)get_cycle()"
111                     //  + " - 1511576) > " + burstPosition + " ? "
112                         + " ) > " + burstPosition + " ? "
113                         + burstSize + " : 0)) {\n"
114                         + "            rtems_task_set_priority("
115                         + "RTEMS_SELF, 127, &old_priority);\n"
116                         + "            rtems_task_wake_after("
117                         + "RTEMS_YIELD_PROCESSOR);\n"
118                         + "        }\n"
119                         + "        rtems_task_set_priority(RTEMS_SELF, "
120                         + "wrapper->priority, &old_priority);\n";
121
122                 sed.sed(filename,
123                         "//placeholder for periodic trigger",
124                         periodicTrigger);
125             }
126
127             if (!p.hasOutPorts()) {
128                 sed.sed(filename, "@ENDING_SHAPER@",
129                         "ss_sem_signal(get_sem_terminate("
130                         + _sinkMap.get(p) + "));");
131             } else {
132                 sed.sed(filename, "@ENDING_SHAPER@", "");
133             }
134
135             for(SourceCode sourceCode : p.getSrcList()) {
136                 filename = _dir + _delimiter
137                         + sourceCode.getLocality().replaceAll(
138                         "(.*)\\.[cC][pP]*[pP]*", "$1\\.h");
139                 sed.sed(filename, "<dol.h>", "\"dol.h\"");
140
141                 for (Port port : p.getPortList()) {
142                     Integer portId = _portMap.get(port);
143                     if (!port.getBasename().equals(port.getName())) {
144                         for (Port port2 : p.getPortList()) {
145                             if (port2.getBasename().equals(port.getBasename())) {
146                                 if (_portMap.get(port2) < _portMap.get(port)) {
147                                     portId = _portMap.get(port2);
148                                 }
149                             }
150                         }
151                     }
152                     sed.sed(filename, "(#define[ ]+PORT_\\w*[ ]+)\"?"
153                             + port.getBasename() + "\"?",
154                             "$1 " + portId);
155                 }
156             }
157         }
158         catch (Exception e) {
159             System.out.println("RtemsProcessVisitor: exception "
160                     + "occured: " + e.getMessage());
161             e.printStackTrace();
162         }
163     }
164
165     protected String _dir = null;
166     protected HashMap<Port, Integer> _portMap;
167     protected HashMap<Process, Integer> _sinkMap;
168 }