/* Modnumlib Scicos interfacing function
* Copyright (C) 2009 Alan Layec
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "scicos_block4.h"
/* macros for digital adder */
#define ADDER \
A = A & (C-1); \
B = B & (C-1); \
A = A + B; \
D = (A & C)>>ipar[0]; \
A = A & (C-1);
void adder_c(scicos_block *block,int flag)
{
if((flag==1)||(flag==6)) {
/* counter variables */
int i,j,k;
/* variables for input/output size */
int nu,mu;
/* variables for input/output type */
int intyp,outtyp;
/* ptr for integer parameters */
int *ipar;
/* ptrs for input/output */
double *u1_d,*u2_d;
double *y1_d,*y2_d;
char *u1_c,*u2_c;
char *y1_c,*y2_c;
short *u1_s,*u2_s;
short *y1_s,*y2_s;
long *u1_l,*u2_l;
long *y1_l,*y2_l;
unsigned char *u1_uc,*u2_uc;
unsigned char *y1_uc,*y2_uc;
unsigned short *u1_us,*u2_us;
unsigned short *y1_us,*y2_us;
unsigned long *u1_ul,*u2_ul;
unsigned long *y1_ul,*y2_ul;
/* variables for adder (64 bits) */
unsigned long long A; /* first input / output */
unsigned long long B; /* second input */
unsigned long long C;
unsigned long long D; /* carry output */
/* get size */
nu=GetInPortRows(block,1);
mu=GetInPortCols(block,1);
/* get in/out type */
intyp=GetInType(block,1);
outtyp=GetOutType(block,1);
/* get ipar */
ipar=GetIparPtrs(block);
/* set carry bit */
C = 1 << ipar[0];
switch(intyp) {
/* complex : real part only */
case 11 :
/* double */
case 10 : u1_d = GetRealInPortPtrs(block,1);
u2_d = GetRealInPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_d[i];
B = (unsigned long long) u2_d[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* int32 */
case 84 : u1_l = Getint32InPortPtrs(block,1);
u2_l = Getint32InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_l[i];
B = (unsigned long long) u2_l[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* int16 */
case 82 : u1_s = Getint16InPortPtrs(block,1);
u2_s = Getint16InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_s[i];
B = (unsigned long long) u2_s[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* int8 */
case 81 : u1_c = Getint8InPortPtrs(block,1);
u2_c = Getint8InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_c[i];
B = (unsigned long long) u2_c[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* uint32 */
case 814 : u1_ul = Getuint32InPortPtrs(block,1);
u2_ul = Getuint32InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_ul[i];
B = (unsigned long long) u2_ul[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* uint16 */
case 812 : u1_us = Getuint16InPortPtrs(block,1);
u2_us = Getuint16InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_us[i];
B = (unsigned long long) u2_us[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
/* uint8 */
case 811 : u1_uc = Getuint8InPortPtrs(block,1);
u2_uc = Getuint8InPortPtrs(block,2);
switch(outtyp) {
/* double */
case 10 :
y1_d = GetRealOutPortPtrs(block,1);
y2_d = GetRealOutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_d[i] = (double) D;
y2_d[i] = (double) A;
}
break;
/* int32 */
case 84 :
y1_l = Getint32OutPortPtrs(block,1);
y2_l = Getint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_l[i] = (long) D;
y2_l[i] = (long) A;
}
break;
/* int16 */
case 82 :
y1_s = Getint16OutPortPtrs(block,1);
y2_s = Getint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_s[i] = (short) D;
y2_s[i] = (short) A;
}
break;
/* int8 */
case 81 :
y1_c = Getint8OutPortPtrs(block,1);
y2_c = Getint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_c[i] = (char) D;
y2_c[i] = (char) A;
}
break;
/* uint32 */
case 814 :
y1_ul = Getuint32OutPortPtrs(block,1);
y2_ul = Getuint32OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_ul[i] = (unsigned long) D;
y2_ul[i] = (unsigned long) A;
}
break;
/* uint16 */
case 812 :
y1_us = Getuint16OutPortPtrs(block,1);
y2_us = Getuint16OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_us[i] = (unsigned short) D;
y2_us[i] = (unsigned short) A;
}
break;
/* uint8 */
case 811 :
y1_uc = Getuint8OutPortPtrs(block,1);
y2_uc = Getuint8OutPortPtrs(block,2);
for(i=0;i<nu*mu;i++) {
A = (unsigned long long) u1_uc[i];
B = (unsigned long long) u2_uc[i];
ADDER
y1_uc[i] = (unsigned char) D;
y2_uc[i] = (unsigned char) A;
}
break;
}
break;
}
}
}