Use scicos_block4 typedef and avoid long use instead of int.
[scilab.git] / scilab / modules / scicos_blocks / src / c / matmul2_m.c
1 /*  Scicos
2 *
3 *  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 * See the file ./license.txt
20 */
21 /*--------------------------------------------------------------------------*/
22 #include <math.h>
23 #include "scicos.h"
24 #include "scicos_block4.h"
25 #include "dynlib_scicos_blocks.h"
26 /*--------------------------------------------------------------------------*/
27 #define matmul2(y1,u1,u2,mu,nu)  {for (i=0;i<mu*nu;i++) y1[i]=u1[i]*u2[i];}
28 /*--------------------------------------------------------------------------*/
29 SCICOS_BLOCKS_IMPEXP void matmul2_m(scicos_block *block, int flag)
30 {
31     if (flag == 1)
32     {
33         int i = 0;
34         int ut = GetInType(block, 1);
35         int mu = GetOutPortRows(block, 1);
36         int nu = GetOutPortCols(block, 1);
37         switch (ut)
38         {
39             case SCSREAL_N :
40             {
41
42                 SCSREAL_COP *u1 = GetRealInPortPtrs(block, 1);
43                 SCSREAL_COP *u2 = GetRealInPortPtrs(block, 2);
44                 SCSREAL_COP *y1 = GetRealOutPortPtrs(block, 1);
45                 matmul2(y1, u1, u2, mu, nu);
46                 break;
47             }
48
49             case SCSINT32_N :
50             {
51                 SCSINT32_COP *u1 = Getint32InPortPtrs(block, 1);
52                 SCSINT32_COP *u2 = Getint32InPortPtrs(block, 2);
53                 SCSINT32_COP *y1 = Getint32OutPortPtrs(block, 1);
54                 matmul2(y1, u1, u2, mu, nu);
55                 break;
56             }
57
58             case SCSINT16_N :
59             {
60
61                 SCSINT16_COP *u1 = Getint16InPortPtrs(block, 1);
62                 SCSINT16_COP *u2 = Getint16InPortPtrs(block, 2);
63                 SCSINT16_COP *y1 = Getint16OutPortPtrs(block, 1);
64                 matmul2(y1, u1, u2, mu, nu);
65                 break;
66             }
67
68             case SCSINT8_N :
69             {
70
71                 SCSINT8_COP *u1 = Getint8InPortPtrs(block, 1);
72                 SCSINT8_COP *u2 = Getint8InPortPtrs(block, 2);
73                 SCSINT8_COP *y1 = Getint8OutPortPtrs(block, 1);
74                 matmul2(y1, u1, u2, mu, nu);
75                 break;
76             }
77
78             case SCSUINT32_N :
79             {
80
81                 SCSUINT32_COP *u1 = Getuint32InPortPtrs(block, 1);
82                 SCSUINT32_COP *u2 = Getuint32InPortPtrs(block, 2);
83                 SCSUINT32_COP *y1 = Getuint32OutPortPtrs(block, 1);
84                 matmul2(y1, u1, u2, mu, nu);
85                 break;
86             }
87
88             case SCSUINT16_N :
89             {
90
91                 SCSUINT16_COP *u1 = Getuint16InPortPtrs(block, 1);
92                 SCSUINT16_COP *u2 = Getuint16InPortPtrs(block, 2);
93                 SCSUINT16_COP *y1 = Getuint16OutPortPtrs(block, 1);
94                 matmul2(y1, u1, u2, mu, nu);
95                 break;
96             }
97
98             case SCSUINT8_N :
99             {
100
101                 SCSUINT8_COP *u1 = Getuint8InPortPtrs(block, 1);
102                 SCSUINT8_COP *u2 = Getuint8InPortPtrs(block, 2);
103                 SCSUINT8_COP *y1 = Getuint8OutPortPtrs(block, 1);
104                 matmul2(y1, u1, u2, mu, nu);
105                 break;
106             }
107
108             case SCSCOMPLEX_N :
109             {
110                 SCSREAL_COP *u1r = GetRealInPortPtrs(block, 1);
111                 SCSREAL_COP *u2r = GetRealInPortPtrs(block, 2);
112                 SCSREAL_COP *y1r = GetRealOutPortPtrs(block, 1);
113                 SCSREAL_COP *u1i = GetImagInPortPtrs(block, 1);
114                 SCSREAL_COP *u2i = GetImagInPortPtrs(block, 2);
115                 SCSREAL_COP *y1i = GetImagOutPortPtrs(block, 1);
116                 for (i = 0; i < mu * nu; i++)
117                 {
118                     y1r[i] = (u1r[i] * u2r[i]) - (u1i[i] * u2i[i]);
119                     y1i[i] = (u1r[i] * u2i[i]) + (u1i[i] * u2r[i]);
120                 }
121                 break;
122             }
123
124             default :
125             {
126                 set_block_error(-4);
127                 return;
128             }
129         }
130     }
131
132 }
133 /*--------------------------------------------------------------------------*/