function ese = mttCreateAlternativeEquations(model)
ese = write_equations(model) ;
ese = ese' ;
filename = [model.source,'_ese.txt'] ;
fid = fopen(filename,'w') ;
fprintf(fid,['// Elementary System Equations\n']) ;
fprintf(fid,'\n') ;
fprintf(fid,['// file: ',filename,'\n']) ;
fprintf(fid,['// written by MTT on ',datestr(now),'\n']) ;
fprintf(fid,'\n\n') ;
fprintf(fid,['ese ',mttDetachText(model.source,'/'),' {']) ;
fprintf(fid,'\n') ;
tab = char(32*ones(1,3)) ;
for i = 1:length(ese)
fprintf(fid,[tab,ese{i},'\n']) ;
end
fprintf(fid,'}') ;
fclose(fid) ;
function ese = write_equations(model,branch)
is_root_model = (nargin==1) ;
if is_root_model
branch = mttDetachText(model.source,'/') ;
end
% ese{1} = ' ' ;
% ese{2} = ['// ESE representation for module: ',branch] ;
% ese{3} = ' ' ;
%
% line = 3 ;
line = 0 ;
indent = char(32*ones(1,6)) ;
objects = mttGetFieldNames(model,'obj') ;
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
here = [branch,':',object_name] ;
switch object.class
case 'SS',
for j = 1:mttGetFieldLength(object,'interface')
flow_equation = [] ;
effort_equation = [] ;
port_name = object.interface(j).name ;
inbond = object.interface(j).in ;
outbond = object.interface(j).out ;
if ~isempty(inbond)
bond = model.bond(inbond) ;
extern = [branch,'__',object_name,'___flow'] ;
intern = [branch,'___f[',num2str(inbond),']'] ;
if bond.flow
flow_equation = [intern,' = ',extern,' ;'] ;
else
flow_equation = [extern,' = ',intern,' ;'] ;
end
extern = [branch,'__',object_name,'___effort'] ;
intern = [branch,'___e[',num2str(inbond),']'] ;
if bond.effort
effort_equation = [extern,' = ',intern,' ;'] ;
else
effort_equation = [intern,' = ',extern,' ;'] ;
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
if ~isempty(outbond)
bond = model.bond(outbond) ;
extern = [branch,'__',object_name,'___flow'] ;
intern = [branch,'___f[',num2str(outbond),']'] ;
if bond.flow
flow_equation = [extern,' = ',intern,' ;'] ;
else
flow_equation = [intern,' = ',extern,' ;'] ;
end
extern = [branch,'__',object_name,'___effort'] ;
intern = [branch,'___e[',num2str(outbond),']'] ;
if bond.effort
effort_equation = [intern,' = ',extern,' ;'] ;
else
effort_equation = [extern,' = ',intern,' ;'] ;
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
end
case '0',
imposed_effort = [] ;
resultant_flow = [] ;
for i = 1:mttGetFieldLength(object,'interface')
inbond = object.interface(i).in ;
outbond = object.interface(i).out ;
if isempty(inbond)
bond_number(i) = outbond ;
orientation(i) = 0 ;
else
bond_number(i) = inbond ;
orientation(i) = 1 ;
end
[effort(i),flow(i)] = mttGetBondCausality(model,bond_number(i)) ;
if effort(i)==orientation(i)
imposed_effort_bond = bond_number(i) ;
imposed_effort = [branch,'___e[',num2str(imposed_effort_bond),']'] ;
end
if flow(i)==orientation(i)
resultant_flow_bond = bond_number(i) ;
resultant_flow = [branch,'___f[',num2str(resultant_flow_bond),']'] ;
end
end
for i = 1:mttGetFieldLength(object,'interface')
if bond_number(i)~=imposed_effort_bond
line = line + 1 ;
derived_effort = [branch,'___e[',num2str(bond_number(i)),']'] ;
ese{line} = [derived_effort,' = ',imposed_effort,' ;'] ;
end
end
waiting = 1 ;
offset = char(32*ones(1,length(resultant_flow)+1)) ;
for i = 1:mttGetFieldLength(object,'interface')
next_flow = [] ;
if bond_number(i)~=resultant_flow_bond
next_flow = [branch,'___f[',num2str(bond_number(i)),']'] ;
line = line + 1 ;
if waiting
if orientation(i)
ese{line} = [resultant_flow,' = ',next_flow] ;
else
ese{line} = [resultant_flow,' = -',next_flow] ;
end
waiting = 0 ;
else
if orientation(i)
ese{line} = [offset,'+ ',next_flow] ;
else
ese{line} = [offset,'- ',next_flow] ;
end
end
end
end
ese{line} = [ese{line},' ;'] ;
case '1',
imposed_flow = [] ;
resultant_effort = [] ;
for i = 1:mttGetFieldLength(object,'interface')
inbond = object.interface(i).in ;
outbond = object.interface(i).out ;
if isempty(inbond)
bond_number(i) = outbond ;
orientation(i) = 0 ;
else
bond_number(i) = inbond ;
orientation(i) = 1 ;
end
[effort(i),flow(i)] = mttGetBondCausality(model,bond_number(i)) ;
if flow(i)~=orientation(i)
imposed_flow_bond = bond_number(i) ;
imposed_flow = [branch,'___f[',num2str(imposed_flow_bond),']'] ;
end
if effort(i)~=orientation(i)
resultant_effort_bond = bond_number(i) ;
resultant_effort = [branch,'___e[',num2str(resultant_effort_bond),']'] ;
end
end
for i = 1:mttGetFieldLength(object,'interface')
if bond_number(i)~=imposed_flow_bond
line = line + 1 ;
derived_flow = [branch,'___f[',num2str(bond_number(i)),']'] ;
ese{line} = [derived_flow,' = ',imposed_flow,' ;'] ;
end
end
waiting = 1 ;
offset = char(32*ones(1,length(resultant_effort)+1)) ;
for i = 1:mttGetFieldLength(object,'interface')
next_effort = [] ;
if bond_number(i)~=resultant_effort_bond
next_effort = [branch,'___e[',num2str(bond_number(i)),']'] ;
line = line + 1 ;
if waiting
if orientation(i)
ese{line} = [resultant_effort,' = ',next_effort] ;
else
ese{line} = [resultant_effort,' = -',next_effort] ;
end
waiting = 0 ;
else
if orientation(i)
ese{line} = [offset,'+ ',next_effort] ;
else
ese{line} = [offset,'- ',next_effort] ;
end
end
end
end
ese{line} = [ese{line},' ;'] ;
otherwise,
if ~isempty(object.cr)
operators = object.cr.operator ;
interface = object.cr.interface ;
port_names = mttGetFieldNames(interface,'port') ;
link_counter = 0 ;
for i = 1:length(port_names)
port_name = port_names{i} ;
port = getfield(interface,'port',port_name) ;
terminal = [branch,'__',object_name,'___',port_name] ;
inbond = port.in ;
outbond = port.out ;
if ~isempty(inbond)
bond = model.bond(inbond) ;
intern = [branch,'___f[',num2str(inbond),']'] ;
if bond.flow
link_counter = link_counter + 1 ;
link(link_counter) = create_link(0,0,1,port_name,port.is_flow_state) ;
if port.is_flow_state
flow_equation = [intern,' = ',terminal,'___flow_state ;'] ;
else
flow_equation = [intern,' = ',terminal,'___flow ;'] ;
end
else
link_counter = link_counter + 1 ;
link(link_counter) = create_link(1,0,1,port_name,port.is_flow_state) ;
if port.is_flow_state
flow_equation = [terminal,'___flow_state = ',intern,' ;'] ;
else
flow_equation = [terminal,'___flow = ',intern,' ;'] ;
end
end
intern = [branch,'___e[',num2str(inbond),']'] ;
if bond.effort
link_counter = link_counter + 1 ;
link(link_counter) = create_link(1,1,0,port_name,port.is_effort_state) ;
if port.is_effort_state
effort_equation = [terminal,'___effort_state = ',intern,' ;'] ;
else
effort_equation = [terminal,'___effort = ',intern,' ;'] ;
end
else
link_counter = link_counter + 1 ;
link(link_counter) = create_link(0,1,0,port_name,port.is_effort_state) ;
if port.is_effort_state
effort_equation = [intern,' = ',terminal,'___effort_state ;'] ;
else
effort_equation = [intern,' = ',terminal,'___effort ;'] ;
end
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
if ~isempty(outbond)
bond = model.bond(outbond) ;
intern = [branch,'___f[',num2str(outbond),']'] ;
if bond.flow
link_counter = link_counter + 1 ;
link(link_counter) = create_link(1,0,1,port_name,port.is_flow_state) ;
if port.is_flow_state
flow_equation = [terminal,'___flow_state = ',intern,' ;'] ;
else
flow_equation = [terminal,'___flow = ',intern,' ;'] ;
end
else
link_counter = link_counter + 1 ;
link(link_counter) = create_link(0,0,1,port_name,port.is_flow_state) ;
if port.is_flow_state
flow_equation = [intern,' = ',terminal,'___flow_state ;'] ;
else
flow_equation = [intern,' = ',terminal,'___flow ;'] ;
end
end
intern = [branch,'___e[',num2str(outbond),']'] ;
if bond.effort
link_counter = link_counter + 1 ;
link(link_counter) = create_link(0,1,0,port_name,port.is_effort_state) ;
if port.is_effort_state
effort_equation = [intern,' = ',terminal,'___effort_state ;'] ;
else
effort_equation = [intern,' = ',terminal,'___effort ;'] ;
end
else
link_counter = link_counter + 1 ;
link(link_counter) = create_link(1,1,0,port_name,port.is_effort_state) ;
if port.is_effort_state
effort_equation = [terminal,'___effort_state = ',intern,' ;'] ;
else
effort_equation = [terminal,'___effort = ',intern,' ;'] ;
end
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
end
number_of_operators = length(operators) ;
op_counter = 1 ;
matching = 1 ;
while matching
operator = operators(op_counter) ;
links = length(link) ;
op_links = length(operator.link) ;
op_linked = zeros(op_links,1) ;
for j = 1:op_links
for k = 1:links
if compare_links(link(k),operator.link(j))
op_linked(j) = k ;
break ;
end
end
end
input_counter = 0 ;
output_counter = 0 ;
input = [] ;
output = [] ;
if all(op_linked)
for j = 1:op_links
current_link = link(op_linked(j)) ;
port_name = current_link.name ;
if current_link.is_effort
if current_link.is_state
link_name = [branch,'__',object_name,'___',port_name,'___effort_state'] ;
else
link_name = [branch,'__',object_name,'___',port_name,'___effort'] ;
end
end
if current_link.is_flow
if current_link.is_state
link_name = [branch,'__',object_name,'___',port_name,'___flow_state'] ;
else
link_name = [branch,'__',object_name,'___',port_name,'___flow'] ;
end
end
if current_link.is_input
input_counter = input_counter + 1 ;
input{input_counter} = link_name ;
else
output_counter = output_counter + 1 ;
output{output_counter} = link_name ;
end
end
if input_counter>0
input_list = ['[',input{1}] ;
for j = 2:input_counter
input_list = [input_list,',',input{j}] ;
end
input_list = [input_list,']'] ;
end
if output_counter>0
output_list = ['[',output{1}] ;
for j = 2:output_counter
output_list = [output_list,',',output{j}] ;
end
output_list = [output_list,']'] ;
end
if input_counter>0
line = line + 1 ;
ese{line} = [output_list,' = '] ;
end
line = line + 1 ;
ese{line} = [indent,branch,'__',object_name,'___',operator.name] ;
if output_counter>0
line = line + 1 ;
ese{line} = [indent,indent,input_list,' ;'] ;
end
link(op_linked) = [] ;
end
op_counter = op_counter + 1 ;
matching = ~isempty(link) & (op_counter<=number_of_operators) ;
end
mttAssert(isempty(link),...
['Unattached ports in "cr" implementation in ',here]) ;
end
end
end
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
here = [branch,':',object_name] ;
if ~isempty(object.abg)
for j = 1:mttGetFieldLength(object,'interface')
inbond = object.interface(j).in ;
outbond = object.interface(j).out ;
inmap = object.interface(j).map.in ;
outmap = object.interface(j).map.out ;
line = line + 1 ;
ese{line} = ' ' ;
if ~isempty(inbond)
bond = model.bond(inbond) ;
extern = [branch,'__',object_name,'___f[',num2str(inmap),']'] ;
intern = [branch,'___f[',num2str(inbond),']'] ;
if bond.flow
flow_equation = [intern,' = ',extern,' ;'] ;
else
flow_equation = [extern,' = ',intern,' ;'] ;
end
extern = [branch,'__',object_name,'___e[',num2str(inmap),']'] ;
intern = [branch,'___e[',num2str(inbond),']'] ;
if bond.effort
effort_equation = [extern,' = ',intern,' ;'] ;
else
effort_equation = [intern,' = ',extern,' ;'] ;
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
if ~isempty(outbond)
bond = model.bond(outbond) ;
extern = [branch,'__',object_name,'___f[',num2str(outmap),']'] ;
intern = [branch,'___f[',num2str(outbond),']'] ;
if bond.flow
flow_equation = [extern,' = ',intern,' ;'] ;
else
flow_equation = [intern,' = ',extern,' ;'] ;
end
extern = [branch,'__',object_name,'___e[',num2str(outmap),']'] ;
intern = [branch,'___e[',num2str(outbond),']'] ;
if bond.effort
effort_equation = [intern,' = ',extern,' ;'] ;
else
effort_equation = [extern,' = ',intern,' ;'] ;
end
line = line + 1 ;
ese{line} = flow_equation ;
line = line + 1 ;
ese{line} = effort_equation ;
end
end
next_branch = [branch,'__',object_name] ;
object_ese = write_equations(object,next_branch) ;
ese = [ese, object_ese] ;
line = length(ese) ;
end
end
function link = create_link(is_input,is_effort,is_flow,name,is_state)
link.is_input = is_input ;
link.is_effort = is_effort ;
link.is_flow = is_flow ;
link.name = name ;
link.is_state = is_state ;
function boolean = compare_links(actual_link,op_link)
input_is_same = actual_link.is_input==op_link.is_input ;
effort_is_same = actual_link.is_effort==op_link.is_effort ;
flow_is_same = actual_link.is_flow==op_link.is_flow ;
name_is_same = strcmp(actual_link.name,op_link.name) ;
boolean = input_is_same & effort_is_same & flow_is_same & name_is_same ;