a0d5818eb7070cbe98ef9b362d18a3fab6d4f43e
[scilab.git] / scilab / modules / scicos / macros / scicos_scicos / check_io.sci
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., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //
19 // See the file ../license.txt
20 //
21
22 function [model,graphics,ok]=check_io(model,graphics,in,out,clkin,clkout,in_implicit,out_implicit)
23 // check_io first check if given number of ports agree with block connection
24 // and then changes block structure
25 //%parameters
26 // model   : initial and resulting block model structure
27 // graphics: initial and resulting block graphics structure
28 // in      : new input ports sizes
29 // nout    : new output ports sizes
30 // nclkin  : new event input ports sizes
31 // nclkout : new event output ports sizes
32 // in_impl : index of implicit input ports, the other ports are supposed to be explicit
33 // out_impl: index of implicit output ports , the other ports are supposed to be explicit
34 // ok      : error flag
35 //           ok==%f : some of input parameters are incorrects or
36 //                    attempt to add/delete ports when some are connected
37 //           ok==%t  : changes of block structure has been performed
38 //!
39   if argn(2)<=6 then in_implicit=[],out_implicit=[],end
40 // check_io first check if given number of ports agree with block connection
41   in=int(in(:));nin=size(in,1)
42
43   out=int(out(:));nout=size(out,1);
44
45   clkin=int(clkin(:));nclkin=size(clkin,1);
46   if nclkin>0 then
47     if mini(clkin)<1 then
48       message('Event input ports sizes must be positive')
49       ok=%f
50       return
51     end
52   end
53
54
55   clkout=int(clkout(:));nclkout=size(clkout,1);
56   if nclkout>0 then
57     if mini(clkout)<1 then
58       message('Event output ports sizes must be positive')
59       ok=%f
60       return
61     end
62   end
63
64
65   [label,ip1,op1,cip1,cop1]=(graphics.exprs,graphics.pin,graphics.pout,..
66                                             graphics.pein,graphics.peout)
67
68   [in1,out1,clkin1,clkout1]=(model.in,model.out,model.evtin,model.evtout)
69
70   n1=size(in1(:,1),'*');n=size(in(:,1),'*')
71   if n1>n then
72     if or(ip1(n+1:$)>0) then
73       message('Connected ports cannot be suppressed')
74       ok=%f
75       return
76     end
77     ip1=ip1(1:n)
78   else
79     ip1=[ip1;zeros(n-n1,1)]
80   end
81
82   n1=size(out1,'*');n=size(out,'*')
83   if n1>n then
84     if or(op1(n+1:$)>0) then
85       message('Connected ports cannot be suppressed')
86       ok=%f
87       return
88     end
89     op1=op1(1:n)
90   else
91     op1=[op1;zeros(n-n1,1)]
92   end
93
94   n1=size(clkin1,'*');n=size(clkin,'*')
95   if n1>n then
96     if or(cip1(n+1:$)>0) then
97       message('Connected ports cannot be suppressed')
98       ok=%f
99       return
100     end
101     cip1=cip1(1:n)
102   else
103     cip1=[cip1;zeros(n-n1,1)];
104   end
105
106   n1=size(clkout1,'*');n=size(clkout,'*')
107   if n1>n then
108     if or(cop1(n+1:$)>0) then
109       message('Connected ports cannot be suppressed')
110       ok=%f
111       return
112     end
113     cop1=cop1(1:n);
114   else
115     cop1=[cop1;zeros(n-n1,1)];
116   end
117
118   I='E';
119
120
121   if ip1<>[] then
122     in_impl=I(ones(ip1)); in_impl(in_implicit)='I';
123     kk=size(graphics.in_implicit,'*')
124     k=find(ip1<>0) //connected links
125     k=k(find(k<=kk));
126     if or(graphics.in_implicit(k)<>in_impl(k)) then
127       message('Connected ports types cannot be changed')
128       ok=%f
129       return
130     end
131   else
132     in_impl=[]
133   end
134
135
136   if op1<>[] then
137     out_impl=I(ones(op1));  out_impl(out_implicit)='I';
138     kk=size(graphics.out_implicit,'*')
139     k=find(op1<>0) //connected links
140     k=k(find(k<=kk));
141     if or(graphics.out_implicit(k)<>out_impl(k)) then
142       message('Connected ports types cannot be changed')
143       ok=%f
144       return
145     end
146   else
147     out_impl=[]
148   end
149   
150   ok=%t
151
152   graphics.pin=ip1
153   graphics.pout=op1
154   graphics.pein=cip1
155   graphics.peout=cop1
156   graphics.in_implicit=in_impl
157   graphics.out_implicit=out_impl
158   
159   if size(in1,2)<=1 then
160     model.in=in
161   elseif size(in1,2)==2 then //This appears not to be useful, retained if case of?
162     disp("check_io : unexpected case")
163     model.in=[in,2*ones(in)];
164   end
165   
166   if size(out1,2)<=1 then
167     model.out=out
168   elseif size(out1,2)==2 then //This appears not to be useful, retained if case of?
169     disp("check_io : unexpected case")
170     model.out=[out,2*ones(out)];
171   end
172   model.evtin=clkin
173   model.evtout=clkout
174
175
176 endfunction
177