Index: mttroot/mtt/bin/trans/m/abg2cbg.m ================================================================== --- mttroot/mtt/bin/trans/m/abg2cbg.m +++ mttroot/mtt/bin/trans/m/abg2cbg.m @@ -1,8 +1,8 @@ function [port_bonds, status] = abg2cbg(system_name, ... system_type, full_name, ... - port_bonds, typefile, infofile) + port_bonds, port_status, typefile, infofile) % abg2cbg - acausal to causal bg conversion % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%% Model Transformation Tools %%%%% @@ -15,10 +15,14 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% Version control history % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% $Id$ % %% $Log$ +% %% Revision 1.16 1997/08/04 13:11:19 peterg +% %% Only change to component-orientated causality for simple components +% %% NOT for compound components. +% %% % %% Revision 1.15 1997/01/05 12:25:59 peterg % %% More informative message about port bonds incompatible with ports % %% % %% Revision 1.14 1996/12/31 16:20:42 peterg % %% Just write causality information at top level -- it gets a bit @@ -66,11 +70,11 @@ % %% Revision 1.1 1996/08/04 17:55:55 peter % %% Initial revision % %% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - +mtt_info(system_name, infofile); pc = '%'; if nargin<1 system_name = 'no_name'; end; @@ -91,36 +95,38 @@ fprintf(typefile, '# Commands to map types onto subsystems\n'); fprintf(typefile, '# File %s_type.sh\n', system_name); fprintf(typefile, '# Generated by MTT on %s\n\n', date); end; -full_name -length(full_name) - % Create the (full) system name if at_top_level full_name = system_name; system_type = system_name; else full_name = [full_name, '_', system_name]; end; + % Add to file to contain shell commands which map subsystem types % onto components fprintf(typefile, '$1%s$2%s$3\n', system_type, full_name); -fun_name = [system_type, '_abg'] +fun_name = [system_type, '_abg']; + +disp('===================================='); +disp(['BEGIN: ', full_name, ' (', fun_name, ')']); +disp('===================================='); % If no such function - then there is nothing to be done. if exist(fun_name)~=2 mtt_info(['m-file ', fun_name, ' does not exist'], infofile); bonds = []; status = []; return end; -% Evaluate the system function to get the bonds +% Evaluate the system function to get the bonds and number of ports eval(['[bonds,components,n_ports]=', fun_name, ';']); % Find number of bonds [n_bonds,columns] = size(bonds); if (columns ~= 2)&(n_bonds>0) @@ -132,56 +138,52 @@ [n_components,columns] = size(components); if n_components==0 % there is nothing to be done return end; -% If not at top level, then sort out the port bonds. -if at_top_level==0 +% Set initial status +status = -ones(n_components,1); + +% If not at top level, then copy the port bonds. +if ~at_top_level % Find number of port bonds [n_port_bonds,columns] = size(port_bonds); % Check compatibility - if ok copy port bonds to the internal bonds list. if n_port_bonds~=n_ports - mtt_info(sprintf('%s: %1.0f port bonds incompatible with %1.0f ports', ... - full_name, n_port_bonds, n_ports), infofile); - else % Copy the port bonds -- but only if not set already - for i = 1:n_ports % The port SSs come first - j = abs(components(i,1)); % Get the bonds attached to the ports - direction = -sign(components(i,1)); - for k=1:2 - if bonds(j,k)==0 % causality not set yet - so copy. - bonds(j,k) = direction*port_bonds(i,k); - end; - end; - end; - end; -end; - - -% Set initial status -status = -ones(n_components,1); -total = 2*n_bonds; - + mtt_info(sprintf('%s: %1.0f port bonds incompatible with %1.0f ports', ... + full_name, n_port_bonds, n_ports), infofile); + + else % Copy the port bonds & status + j = abs(components(1:n_ports,1)); %relevant bond numbers + bonds(j,:) = port_bonds; + status(1:n_ports) = port_status; + end +end; + +% Causality indicator +total = 2*n_bonds; done = sum(sum(abs(bonds)))/total*100; % Outer while loop sets preferred causality ci_index=1; while( ci_index>0) old_done = inf; % Inner loop propagates causality while done~=old_done - disp(sprintf('Causality is %3.0f%s complete.', done, pc)); + % disp(sprintf('Causality is %3.0f%s complete.', done, pc)); old_done = done; for i = 1:n_components if status(i) ~= 0 % only do this if causality not yet complete - + % Get the bonds on this component - comp = nozeros(components(i,:)); - bond_list = abs(comp); - direction = sign(comp)'*[1 1]; + comp = nozeros(components(i,:)) + bond_list = abs(comp) + direction = sign(comp)'*[1 1] + n_bonds = length(bond_list); % Get the component details eval([ '[comp_type,name,cr,arg] = ', system_type, '_cmp(i);' ]); % Change name of 0 and 1 components -- matlab doesn't like numbers here @@ -194,15 +196,20 @@ % Component causality procedure name cause_name = [comp_type, '_cause']; % Bonds on this component (arrow-orientated) - comp_bonds = bonds(bond_list,:); + port_bonds = bonds(bond_list,:); % Invoke the appropriate causality procedure if exist(cause_name)~=2 % Try a compound component - [comp_bonds,s] = abg2cbg(name, comp_type, full_name, comp_bonds, ... + % Port status depends on whether the corresponding bonds are + % fully causal at this stage. + one = ones(n_bonds,1); + port_status = (sum(abs(port_bonds'))'==2*one) - one; + [port_bonds,s] = abg2cbg(name, comp_type, full_name, + port_bonds, port_status, ... typefile, infofile); % Create a single status from the status vector s if max(abs(s)) == 0 % Causal status(i) = 0; @@ -213,29 +220,34 @@ status(i) = -1; end; end; else % its a simple component + port_bonds_in = port_bonds + % Convert from arrow orientated to component orientated causality - comp_bonds = comp_bonds.*direction; + port_bonds = port_bonds.*direction; disp(['---', name, ' (', cause_name, ') ---']); + % Evaluate the built-in causality procedure - eval([ '[comp_bonds,status(i)] = ', cause_name, '(comp_bonds);' ]); + eval([ '[port_bonds,status(i)] = ', cause_name, '(port_bonds);' ]); % and convert from component orientated to arrow orientated causality - comp_bonds = comp_bonds.*direction; + port_bonds = port_bonds.*direction; + + port_bonds_out = port_bonds end; % Update the full bonds list - bonds(bond_list,:) = comp_bonds; + bonds(bond_list,:) = port_bonds end; end; done = sum(sum(abs(bonds)))/total*100; - % mtt_info(sprintf('Causality is %3.0f%s complete.', done, pc), infofile); + %disp(sprintf('Causality is %3.0f%s complete.', done, pc), infofile)); end; % Set causality of a C or I which is not already set [ci_index,prefered] = getdynamic(status,system_type); @@ -274,27 +286,21 @@ end; end; end; % $$$ file_name = [full_name, '_', system_type] -file_name = [full_name, '_cbg.m'] +file_name = [full_name, '_cbg.m']; +disp(['Writing ', file_name]); cbgfilenum = fopen(file_name,'w'); write_cbg(cbgfilenum,full_name,system_type,bonds,status); fclose(cbgfilenum); -% Return the port bonds -for i = 1:n_ports % The port SSs come first - j = abs(components(i,1)); % Get the bonds attached to the ports - direction = -sign(components(i,1)); - port_bonds(i,:) = direction*bonds(j,:); +% Return the port bonds - arrow orientated causality +if ~at_top_level %Not at top level + j = abs(components(1:n_ports,1)) %relevant bond numbers + port_bonds = bonds(j,:) end; -disp('----------------------'); - - - - - - - - +disp('===================================='); +disp(['END: ', full_name, ' (', fun_name, ')']); +disp('====================================');