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">
5 <variable value="2" name="N"/> <!-- number of rows/columns of square matrix -->
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"/>
18 <port type="output" name="matrixB">
19 <append function="row"/>
20 <append function="col"/>
21 <append function="i"/>
26 <iterator variable="i" range="N * N">
27 <port type="output" name="zeroinput">
28 <append function="i"/>
31 <source type="c" location="generator.c"/>
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"/>
44 <source type="c" location="consumer.c"/>
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"/>
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"/>
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"/>
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"/>
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"/>
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"/>
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"/>
145 <target name="matrixAchannel">
146 <append function="i"/>
147 <append function="row"/>
148 <append function="col"/>
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"/>
164 <target name="matrixBchannel">
165 <append function="i"/>
166 <append function="row"/>
167 <append function="col"/>
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"/>
180 <target name="zerochannel">
181 <append function="i"/>
182 <append function="row"/>
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"/>
204 <target name="addmult">
205 <append function="i"/>
206 <append function="row"/>
207 <append function="col"/>
208 <port name="factor1"/>
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"/>
224 <target name="addmult">
225 <append function="i"/>
226 <append function="row"/>
227 <append function="col"/>
228 <port name="factor2"/>
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"/>
242 <target name="addmult">
243 <append function="i"/>
244 <append function="row"/>
245 <append function="0"/>
246 <port name="summand"/>
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"/>
266 <target name="addmultchannel">
267 <append function="i"/>
268 <append function="row"/>
269 <append function="col"/>
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"/>
291 <target name="addmult">
292 <append function="i"/>
293 <append function="row"/>
294 <append function="col + 1"/>
295 <port name="summand"/>
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"/>
314 <target name="resultchannel">
315 <append function="row"/>
316 <append function="col"/>
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"/>
334 <target name="output_consumer">
335 <port name="matrixC">
336 <append function="row"/>
337 <append function="col"/>