1 /* $Id: RtemsProcessVisitor.java 213 2010-10-20 09:40:59Z khuang $ */
2 package dol.visitor.rtems;
5 import java.util.HashMap;
6 import java.util.Vector;
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;
15 import dol.visitor.PNVisitor;
18 * This class is a class for a visitor that is used to generate
19 * a wrapper class for a process.
21 public class RtemsProcessVisitor extends PNVisitor {
26 * @param dir target directory
28 public RtemsProcessVisitor(String dir,
29 HashMap<Port, Integer> portMap,
30 HashMap<Process, Integer> sinkMap) {
38 * @param x process network that needs to be processed
40 public void visitComponent(ProcessNetwork x) {
42 Vector<String> pList = new Vector<String>();
44 for (Process p : x.getProcessList()) {
45 String basename = p.getBasename();
46 if (!pList.contains(basename)) {
53 System.out.println("RtemsProcessVisitor: exception "
54 + "occured: " + e.getMessage());
62 * @param p process that needs to be processed
64 public void visitComponent(Process p) {
66 String filename = _dir + _delimiter + p.getBasename()
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);
74 for (SourceCode code : p.getSrcList()) {
75 includes += "#include \"" + code.getLocality() + "\""
76 + System.getProperty("line.separator");
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));
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();
98 if (triggerPeriod != null) {
99 if (burstSize == null) {
102 if (burstPosition == null) {
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"
119 + " rtems_task_set_priority(RTEMS_SELF, "
120 + "wrapper->priority, &old_priority);\n";
123 "//placeholder for periodic trigger",
127 if (!p.hasOutPorts()) {
128 sed.sed(filename, "@ENDING_SHAPER@",
129 "ss_sem_signal(get_sem_terminate("
130 + _sinkMap.get(p) + "));");
132 sed.sed(filename, "@ENDING_SHAPER@", "");
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\"");
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);
152 sed.sed(filename, "(#define[ ]+PORT_\\w*[ ]+)\"?"
153 + port.getBasename() + "\"?",
158 catch (Exception e) {
159 System.out.println("RtemsProcessVisitor: exception "
160 + "occured: " + e.getMessage());
165 protected String _dir = null;
166 protected HashMap<Port, Integer> _portMap;
167 protected HashMap<Process, Integer> _sinkMap;