## -*-octave-*-
function [bonds,components,n_vector_bonds] = ibg2abg(name,bonds, \
infofile, \
errorfile)
## Provide useful data for log
struct_levels_to_print = 5;
## Find number of bonds
[n_bonds, junk] = size(struct_elements(bonds));
## Get components
max_bonds_on_component = 0;
for i = 1:n_bonds
eval(sprintf("bond = bonds.b%i", i));
## heads
head_type_name = bond.head.component;
head_type_name = deblank(split(head_type_name, ":"));
head_type = deblank(head_type_name(1,:));
head_name = deblank(head_type_name(2,:));
if (exist("component_struct"))
if (struct_contains(component_struct, head_name))
## create a copy to work on - clearer than eval(sprintf(...))
## (pointers would be better still!)
eval(sprintf("head = component_struct.%s;", head_name));
endif
endif
head.type = head_type;
if (!struct_contains(head,"bonds"))
head.n_bonds = 1;
head.bonds = [+i];
head.named_ports = !strcmp(bond.head.ports, "[]");
else
head.n_bonds = head.n_bonds + 1;
head.bonds = [head.bonds, +i];
head.named_ports = head.named_ports + !strcmp(bond.head.ports, \
"[]");
endif
eval(sprintf("head.ports.bond%i.name = '%s'", i, bond.head.ports));
eval(sprintf("head.ports.bond%i.sign = '[in]'", i));
max_bonds_on_component = max(max_bonds_on_component, \
head.n_bonds)
eval(sprintf("component_struct.%s = head", head_name));
clear head;
## tails
tail_type_name = bond.tail.component;
tail_type_name = deblank(split(tail_type_name, ":"));
tail_type = deblank(tail_type_name(1,:));
tail_name = deblank(tail_type_name(2,:));
if (exist("component_struct"))
if (struct_contains(component_struct, tail_name))
## create a copy to work on - clearer than eval(sprintf(...))
tail = eval(sprintf("tail = component_struct.%s", tail_name));
endif
endif
tail.type = tail_type;
if (!struct_contains(tail,"bonds"))
tail.n_bonds = 1;
tail.bonds = [-i];
tail.named_ports = !strcmp(bond.tail.ports, "[]");
else
tail.n_bonds = tail.n_bonds + 1
tail.bonds = [tail.bonds, -i];
tail.named_ports = tail.named_ports + !strcmp(bond.tail.ports, \
"[]");
endif
eval(sprintf("tail.ports.bond%i.name = '%s'", i, bond.tail.ports));
eval(sprintf("tail.ports.bond%i.sign = '[out]'", i));
max_bonds_on_component = max(max_bonds_on_component, \
tail.n_bonds);
eval(sprintf("component_struct.%s = tail", tail_name));
clear tail;
## causality
if (bond.causality.effort == "head")
causality(i,1) = +1;
elseif (bond.causality.effort == "tail")
causality(i,1) = -1;
else
causality(i,1) = 0;
endif
if (bond.causality.flow == "head")
causality(i,2) = -1;
elseif (bond.causality.flow == "tail")
causality(i,2) = +1;
else
causality(i,2) = 0;
endif
endfor
## Get component indices from sys_cmp.m
[n_components, junk] = size(struct_elements(component_struct));
for i = 1:n_components
[comp_type, comp_name] = eval(sprintf("%s_cmp(%i)", name, i));
eval(sprintf("component_struct.%s.index = %i", comp_name, i));
endfor
## Create the connections matrix (components)
components = zeros(n_components, max_bonds_on_component);
for [comp, comp_name] = component_struct
components(comp.index,1:comp.n_bonds) = comp.bonds;
endfor
for [comp, comp_name] = component_struct
## default port names
if ((strcmp(deblank(comp.type), "0")) || (strcmp(deblank(comp.type), "1")))
disp("---- default junctions ----");
if (comp.named_ports == 1) # one named port
for [port, bond_number] = comp.ports
if (!strcmp(port.name,"[]"))
junction_port_name = port.name;
endif
endfor
mtt_info(sprintf("Defaulting all ports on junction %s to %s", \
comp_name, junction_port_name));
for [port, bond_number] = comp.ports
port.name = junction_port_name;
endfor
elseif ((comp.named_ports != 0) && (comp.named_ports != \
comp.n_bonds)) # not allowed
mtt_error(sprintf("Junction %s must have 0, 1 or %i port labels", \
comp_name, comp.n_bonds));
endif
else # Not a junction
unlabelled_ports = comp.n_bonds - comp.named_ports;
if (unlabelled_ports == 1)
## find unlabelled ports
for [port, bond_number] = comp.ports
if (strcmp(deblank(port.name), "[]"))
## found it - default to "in" or "out"
eval(sprintf("comp.ports.%s.name = port.sign", bond_number));
mtt_info(["Defaulting port name [" port.sign "]\t on component " \
comp_name " (" deblank(comp.type) ")"], infofile);
endif
endfor
elseif (unlabelled_ports == 2)
## find unlabelled ports
for [port, bond_number] = comp.ports
if (strcmp(deblank(port.name), "[]"))
## got one
if (exist("unlabelled_port1"))
unlabelled_port2 = port;
bond_number2 = bond_number;
else
unlabelled_port1 = port;
bond_number1 = bond_number;
endif
endif
endfor
if (strcmp(unlabelled_port1.sign, "[in]") && \
strcmp(unlabelled_port2.sign, "[in]"))
mtt_error(["More than one unlabelled INport on component " \
comp_name " (" deblank(comp.type) ")"], errorfile);
elseif (strcmp(unlabelled_port1.sign, "[out]") && \
strcmp(unlabelled_port2.sign, "[out]"))
mtt_error(["More than one unlabelled OUTport on component " \
comp_name " (" deblank(comp.type) ")"], errorfile);
else
eval(sprintf("comp.ports.%s.name = \
unlabelled_port1.sign", bond_number1));
mtt_info(["Defaulting port name [" unlabelled_port1.sign
"]\t on component " comp_name " (" \
deblank(comp.type) ")"], infofile);
eval(sprintf("comp.ports.%s.name = \
unlabelled_port2.sign", bond_number2));
mtt_info(["Defaulting port name [" unlabelled_port2.sign
"]\t on component " comp_name " (" \
deblank(comp.type) ")"], infofile);
endif
endif
## strip port names of blanks and []
for [port, port_name] = comp.ports
eval(sprintf("comp.ports.%s.name = \
mtt_strip_name(comp.ports.%s.name)", port_name, port_name));
endfor
## replace aliases
eval(sprintf("alias = %s_alias", comp.type))
if (is_struct(alias))
for [port, port_name] = comp.ports
if (struct_contains(alias,port_name))
eval(sprintf("new_port_name = alias.%s", port.name))
mtt_info(sprintf("Aliasing name [%s]\t on component %s (%s) to \
[%s]", port.name, comp_name, comp.type, new_port_name), \
infofile);
eval(sprintf("comp.ports.%s.name = new_port_name", port_name))
endif
endfor
endif
endif
eval(sprintf("component_struct.%s = comp", comp_name));
endfor
## All ports should bow be labelled
disp("--- Completed portnames and the corresponding bonds ---");
## Create list of bonds
bonds = causality;
## Find number of bonds on each component BEFORE vectorisation
for [comp, comp_name] = component_struct
n_vector_bonds(comp.index) = comp.n_bonds;
endfor
## Now expand vector ports
disp("Expanding vector ports");
disp("... but not today!");
## ???
components;
n_vector_bonds = 1;
endfunction