f9db3d621d4c1af9d81261ad05802e7a1a6dc8ef
[jump.git] / dol / examples / example4 / example4.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <processnetwork xmlns="http://www.tik.ee.ethz.ch/~shapes/schema/PROCESSNETWORK" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tik.ee.ethz.ch/~shapes/schema/PROCESSNETWORK
3 http://www.tik.ee.ethz.ch/~shapes/schema/processnetwork.xsd" name="MatrixMult"> 
4
5   <variable value="2" name="N"/> <!-- number of rows/columns of square matrix -->
6
7   <!-- instantiate processes -->
8   <!-- process for generating matrices -->
9   <process name="input_generator">
10     <iterator variable="i" range="N">
11       <iterator  variable="row" range="N">
12         <iterator variable="col" range="N">
13           <port type="output" name="matrixA">
14             <append function="row"/>
15             <append function="col"/>
16             <append function="i"/>
17           </port>
18           <port type="output" name="matrixB">
19             <append function="row"/>
20             <append function="col"/>
21             <append function="i"/>
22           </port>
23         </iterator>
24       </iterator>
25     </iterator>
26     <iterator variable="i" range="N * N">
27       <port type="output" name="zeroinput">
28         <append function="i"/>
29       </port>
30     </iterator>
31     <source type="c" location="generator.c"/>
32   </process>
33
34   <!-- process to collect result -->
35   <process name="output_consumer">
36     <iterator  variable="row" range="N">
37       <iterator variable="col" range="N">
38         <port type="input" name="matrixC">
39           <append function="row"/>
40           <append function="col"/>
41         </port>
42       </iterator>
43     </iterator>
44     <source type="c" location="consumer.c"/>
45   </process>
46
47   <!-- processes to compute result -->
48   <iterator variable="i" range="N">
49     <iterator variable="row" range="N">
50       <iterator variable="col" range="N">
51         <process name="addmult">
52           <append function="i"/>
53           <append function="row"/>
54           <append function="col"/>
55           <port type="input" name="factor1"/>
56           <port type="input" name="factor2"/>
57           <port type="input" name="summand"/>
58           <port type="output" name="sum"/>
59           <source type="c" location="addmult.c"/>
60         </process>
61       </iterator>
62     </iterator>
63   </iterator>
64
65
66   <!-- instantiate channels -->
67   <!-- channels for matrices -->
68   <iterator variable="i" range="N">
69     <iterator variable="row" range="N">
70       <iterator variable="col" range="N">
71         <sw_channel type="fifo" size="8" name="matrixAchannel">
72           <append function="i"/>
73           <append function="row"/>
74           <append function="col"/>
75           <port type="input" name="in"/>
76           <port type="output" name="out"/>
77         </sw_channel>
78         <sw_channel type="fifo" size="8" name="matrixBchannel">
79           <append function="i"/>
80           <append function="row"/>
81           <append function="col"/>
82           <port type="input" name="in"/>
83           <port type="output" name="out"/>
84         </sw_channel>
85       </iterator>
86     </iterator>
87   </iterator>
88
89   <!-- channels for zeros -->
90   <iterator variable="i" range="N">
91     <iterator variable="row" range="N">
92       <sw_channel type="fifo" size="8" name="zerochannel">
93         <append function="i"/>
94         <append function="row"/>
95         <port type="input" name="in"/>
96         <port type="output" name="out"/>
97       </sw_channel>
98     </iterator>
99   </iterator>
100
101   <!-- channels for result -->
102   <iterator variable="row" range="N">
103     <iterator variable="col" range="N">
104       <sw_channel type="fifo" size="8" name="resultchannel">
105         <append function="row"/>
106         <append function="col"/>
107         <port type="input" name="in"/>
108         <port type="output" name="out"/>
109       </sw_channel>
110     </iterator>
111   </iterator>
112   
113   <!-- channels between processes -->
114   <iterator variable="i" range="N">
115     <iterator variable="row" range="N">
116       <iterator variable="col" range="N - 1">
117         <sw_channel type="fifo" size="8" name="addmultchannel">
118           <append function="i"/>
119           <append function="row"/>
120           <append function="col"/>
121           <port type="input" name="in"/>
122           <port type="output" name="out"/>
123         </sw_channel>
124       </iterator>
125     </iterator>
126   </iterator>
127
128
129   <!-- instantiate connections -->
130   <!-- connect the input_generator to the "matrix" and zero channels -->
131   <iterator variable="i" range="N">
132     <iterator variable="row" range="N">
133       <iterator variable="col" range="N">
134         <connection name="tomatrixAchannel">
135           <append function="row"/>
136           <append function="col"/>
137           <append function="i"/>
138           <origin name="input_generator">
139             <port name="matrixA">
140               <append function="row"/>
141               <append function="col"/>
142               <append function="i"/>
143             </port>
144           </origin>
145           <target name="matrixAchannel">
146             <append function="i"/>
147             <append function="row"/>
148             <append function="col"/>
149             <port name="in"/>
150           </target>
151         </connection>
152
153         <connection name="tomatrixBchannel">
154           <append function="row"/>
155           <append function="col"/>
156           <append function="i"/>
157           <origin name="input_generator">
158             <port name="matrixB">
159               <append function="row"/>
160               <append function="col"/>
161               <append function="i"/>
162             </port>
163           </origin>
164           <target name="matrixBchannel">
165             <append function="i"/>
166             <append function="row"/>
167             <append function="col"/>
168             <port name="in"/>
169           </target>
170         </connection>
171       </iterator>
172
173       <connection name="tozerochannel">
174         <append function="i * N + row"/>
175         <origin name="input_generator">
176           <port name="zeroinput">
177             <append function="i * N + row"/>
178           </port>
179         </origin>
180         <target name="zerochannel">
181           <append function="i"/>
182           <append function="row"/>
183           <port name="in"/>
184         </target>
185       </connection>
186     </iterator>
187   </iterator>
188   
189   <!-- connect the "matrix" and "zero" channels to the addmults -->
190   <iterator variable="i" range="N">
191     <iterator variable="row" range="N">
192       <iterator variable="col" range="N">
193         <!-- connection for matrix A -->
194         <connection name="matrixA_connection">
195           <append function="i"/>
196           <append function="row"/>
197           <append function="col"/>
198           <origin name="matrixAchannel">
199             <append function="i"/>
200             <append function="row"/>
201             <append function="col"/>
202             <port name="out"/>
203           </origin>
204           <target name="addmult">
205             <append function="i"/>
206             <append function="row"/>
207             <append function="col"/>
208             <port name="factor1"/>
209           </target>
210         </connection>
211
212         <!-- connection for matrix B -->
213         <!-- note the order of appends for matrixBchannel -->
214         <connection name="matrixB_connection">
215           <append function="i"/>
216           <append function="row"/>
217           <append function="col"/>
218           <origin name="matrixBchannel">
219             <append function="row"/>
220             <append function="col"/>
221             <append function="i"/>
222             <port name="out"/>
223           </origin>
224           <target name="addmult">
225             <append function="i"/>
226             <append function="row"/>
227             <append function="col"/>
228             <port name="factor2"/>
229           </target>
230         </connection>
231       </iterator>
232
233       <!-- zero input connections to addmults -->
234       <connection name="zero_connection">
235         <append function="i"/>
236         <append function="row"/>
237         <origin name="zerochannel">
238           <append function="i"/>
239           <append function="row"/>
240           <port name="out"/>
241         </origin>
242         <target name="addmult">
243           <append function="i"/>
244           <append function="row"/>
245           <append function="0"/>
246           <port name="summand"/>
247         </target>
248       </connection>
249     </iterator>
250   </iterator>
251
252   <!-- connections from output of addmults to "addmult" channels -->
253   <iterator variable="i" range="N">
254     <iterator variable="row" range="N">
255       <iterator variable="col" range="N - 1">
256         <connection name="fromaddmult">
257           <append function="i"/>
258           <append function="row"/>
259           <append function="col"/>
260           <origin name="addmult">
261             <append function="i"/>
262             <append function="row"/>
263             <append function="col"/>
264             <port name="sum"/>
265           </origin>
266           <target name="addmultchannel">
267             <append function="i"/>
268             <append function="row"/>
269             <append function="col"/>
270             <port name="in"/>
271           </target>
272         </connection>
273       </iterator>
274     </iterator>
275   </iterator>
276
277   <!-- connections from "addmult" channels to input of addmults -->
278   <iterator variable="i" range="N">
279     <iterator variable="row" range="N">
280       <iterator variable="col" range="N - 1">
281         <connection name="toaddmult">
282           <append function="i"/>
283           <append function="row"/>
284           <append function="col + 1"/>
285           <origin name="addmultchannel">
286             <append function="i"/>
287             <append function="row"/>
288             <append function="col"/>
289             <port name="out"/>
290           </origin>
291           <target name="addmult">
292             <append function="i"/>
293             <append function="row"/>
294             <append function="col + 1"/>
295             <port name="summand"/>
296           </target>
297         </connection>
298       </iterator>
299     </iterator>
300   </iterator>
301   
302   <!-- connections from addmults to "result" channels -->
303   <iterator variable="row" range="N">
304     <iterator variable="col" range="N">
305       <connection name="tomatrixCchannel">
306         <append function="row"/>
307         <append function="col"/>
308         <origin name="addmult">
309           <append function="col"/>
310           <append function="row"/>
311           <append function="N-1"/>
312           <port name="sum"/>
313         </origin>
314         <target name="resultchannel">
315           <append function="row"/>
316           <append function="col"/>
317           <port name="in"/>
318         </target>
319       </connection>
320     </iterator>
321   </iterator>
322
323   <!-- connections from "result" channels to output_consumer -->
324   <iterator variable="row" range="N">
325     <iterator variable="col" range="N">
326       <connection name="frommatrixCchannel">
327         <append function="row"/>
328         <append function="col"/>
329         <origin name="resultchannel">
330           <append function="row"/>
331           <append function="col"/>
332           <port name="out"/>
333         </origin>
334         <target name="output_consumer">
335           <port name="matrixC">
336             <append function="row"/>
337             <append function="col"/>
338           </port>
339         </target>
340       </connection>
341     </iterator>
342   </iterator>
343     
344 </processnetwork>