/* 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; } } }