Fonction d'interfaçage
fr
ADDER_c
function [x,y,typ]=ADDER_c(job,arg1,arg2)
//Copyright INRIA
x=[]
y=[]
typ=[]
select job
case 'plot' then
standard_draw(arg1,%f,adder_draw_ports)
case 'getinputs' then
[x,y,typ]=adder_inputs(arg1)
case 'getoutputs' then
[x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
[x,y]=standard_origin(arg1)
case 'set' then
x=arg1;
graphics=arg1.graphics;
model=arg1.model;
exprs=graphics.exprs;
while %t do
//## define dialog box
ttitle=['Set Digital Adder Block Parameters';
''
'Number of bits :'
' The number of bits of the adder'
''
'Output type :'
' Set the ouput data type'
' 1 - double'
' 3/4/5 - int32/int16/int8'
' 6/7/8 - uint32/uint16/uint8'
'']
[ok,nbit,outtype,exprs]=getvalue(ttitle,...
['Number of bits';'Output type'],...
list('vec',1,'vec',1),exprs)
if ~ok then break,end;
//## check parameters
if nbit<=0 | nbit>32 then
message('Number of bits must be positive and less or equal to 32 bits.')
ok = %f
else
if find(outtype==[1 3 4 5 6 7 8])==[] then
message('Output data type must be double/int32/int16/int8/uint32/uint16 or uint8.')
ok = %f
end
end
//## set model and graphics
if ok then
[model,graphics,ok]=set_io(model,graphics,...
list([-1 -2;-1 -2],[-1 -1]),...
list([-1 -2;-1 -2],[outtype outtype]),[],[])
model.ipar=nbit
model.blocktype='c'
x.model=model
graphics.exprs=exprs
x.graphics=graphics;
break;
end
end
case 'define' then
model=scicos_model()
//## define regular input ports
model.in=[-1;-1]
model.in2=[-2;-2]
model.intyp=[-1;-1]
//## define regular output ports
model.out=[-1;-1]
model.out2=[-2;-2]
model.outtyp=[3;3]
//## define integer parameter
model.ipar=8
//## define computational function
model.sim=list('adder_c',4)
model.blocktype='c'
model.dep_ut=[%t %f]
//## define default parameters values
exprs=[string(8);string(3)]
//## define look of block
gr_i=['o1=orig(1)'
'o2=orig(2)'
's1=sz(1)'
's2=sz(2)'
'phi=acos((s1)/(sqrt((s2/6)^2+(s1)^2)))'
'yh=tan(phi)*(1/3*s1)'
'if orient then'
' x=[o1;o1+s1;o1+s1;o1;o1;o1+(1/3)*s1;o1+(1/3)*s1;o1]'
'else'
' x=[o1+s1;o1;o1;o1+s1;o1+s1;o1+s1-(1/3)*s1;o1+s1-(1/3)*s1;o1+s1]'
'end'
'y=[o2;o2+(1/6)*s2;o2+(5/6)*s2;o2+s2;'+...
'o2+s2-(2/6)*s2;o2+s2-(2/6)*s2-yh;o2+s2-(4/6)*s2+yh;o2+s2-(4/6)*s2]'
'xpoly(x,y,""lines"",1)'
'e=gce()'
'e.line_mode=""on""'
'e.thickness=2'
'e.fill_mode=""on""'
'dx=s1/3'
'dy=s2/6'
'if orient then'
' x=[o1+0.5*s1;o1+0.5*s1+dx]'
'else'
' x=[o1+0.5*s1/3;o1+0.5*s1/3+dx]'
'end'
'y=[o2+1/2*s2;o2+1/2*s2]'
'xpoly(x,y,""lines"")'
'e=gce()'
'e.thickness=2'
'if orient then'
' x=[o1+2/3*s1;o1+2/3*s1]'
'else'
' x=[o1+1/3*s1;o1+1/3*s1]'
'end'
'y=[o2+2.5/6*s2;o2+2.5/6*s2+dy]'
'xpoly(x,y,""lines"")'
'e=gce()'
'e.thickness=2']
x=standard_define([1.5 3],model,exprs,gr_i)
end
endfunction
//## function to draw inputs ports
function adder_draw_ports(o)
//Copyright INRIA
[orig,sz,orient]=(o.graphics.orig,o.graphics.sz,o.graphics.flip)
if orient then //standard orientation
//set port shape
out1=[ 0 -1
1 0
0 1
0 -1]*diag([xf/7,yf/14])
in1= [-1 -1
0 0
-1 1
-1 -1]*diag([xf/7,yf/14])
//draw outputs
dy=sz(2)/(2+1)
xfpoly(out1(:,1)+ones(4,1)*(orig(1)+sz(1)), out1(:,2)+ones(4,1)*(orig(2)+sz(2)-dy), 1)
xfpoly(out1(:,1)+ones(4,1)*(orig(1)+sz(1)), out1(:,2)+ones(4,1)*(orig(2)+sz(2)-dy*2), 1)
//draw inputs
xfpoly(in1(:,1)+ones(4,1)*orig(1), in1(:,2)+ones(4,1)*(orig(2)+sz(2)-(1/6)*sz(2)),1)
xfpoly(in1(:,1)+ones(4,1)*orig(1), in1(:,2)+ones(4,1)*(orig(2)+sz(2)-(5/6)*sz(2)),1)
else //tilded orientation
//set port shape
out1=[0 -1
-1 0
0 1
0 -1]*diag([xf/7,yf/14])
in1= [1 -1
0 0
1 1
1 -1]*diag([xf/7,yf/14])
//draw outputs
dy=sz(2)/(2+1)
xfpoly(out1(:,1)+ones(4,1)*orig(1)-1, out1(:,2)+ones(4,1)*(orig(2)+sz(2)-dy),1)
xfpoly(out1(:,1)+ones(4,1)*orig(1)-1, out1(:,2)+ones(4,1)*(orig(2)+sz(2)-dy*2),1)
//draw inputs
xfpoly(in1(:,1)+ones(4,1)*(orig(1)+sz(1))+1, in1(:,2)+ones(4,1)*(orig(2)+sz(2)-(1/6)*sz(2)),1)
xfpoly(in1(:,1)+ones(4,1)*(orig(1)+sz(1))+1, in1(:,2)+ones(4,1)*(orig(2)+sz(2)-(5/6)*sz(2)),1)
end
endfunction
//## function to define position of inputs ports
function [x,y,typ]=adder_inputs(o)
//Copyright INRIA
xf=60
yf=40
[orig,sz,orient]=(o.graphics.orig,o.graphics.sz,o.graphics.flip)
if orient then
xo=orig(1)
dx=-xf/7
else
xo=orig(1)+sz(1)
dx=yf/7
end
y=orig(2)+sz(2)-(sz(2)*[1/6 5/6])
x=(xo+dx)*ones(y)
typ=[1 1]
endfunction