Building a Twin
The 63-component cap and grouping under owning blocks
vsiBuild refuses a twin with more than 64 components, and the fabric keeps one slot for itself, so 63 is the working limit. A model whose interface definition has 152 ports cannot be one component per port. This page is how the Wildfire model became 63 components without inventing anything.
Ports belong to blocks
In Teamcenter a port is a line under the owning logical block's structure (BOM). The
port_owners.py script reads that structure for every block and records each port's
immediate owner and the block tree. With --owners owners.json, icd_to_vsi.py makes one
component per owning block and gives it all its ports. That alone took Wildfire from 152
components to fewer than the cap, and it keeps the twin's component names identical to the
architecture's block names, which is what a viewer expects to see.
What grouping forces
vsiBuild allows one port per protocol per component (AXI and GPIO excepted). When two Teamcenter ports of the same protocol land on one block, the generator must merge them into one VSI port. The rules:
- Ethernet ports always merge; one port carries any number of sockets. Merged ports are
named
ethernet_pand the assumptions file lists the Teamcenter ports it stands for. - A spoke whose two ends land on the same merged port is omitted (vsiBuild refuses a server and a client of one ip port on one port, and the link would be a component talking to itself). Wildfire lost 22 such intra-block spokes; each is listed.
- Other protocols merge only when they must; the alternative for a folded child is a satellite component, which costs a slot.
- Signals keep their Teamcenter port prefix in their names, so nothing is lost when two ports merge; a merged CAN port still carries the frame of each Teamcenter port.
Fitting the budget
--group-cap (default 63) is the budget. When a model's blocks exceed it, the generator
folds child blocks into their parent, cheapest first by a cost model that counts each
extra strict-protocol port a fold would create, until the twin fits. Every fold is
reported. Wildfire fitted at exactly 63.
What the picture looks like afterwards
A component is a logical block. Ports on it are the block's Teamcenter ports, merged where vsiBuild demands. Buses are the Teamcenter interfaces. A CAN interface with 22 assigned ports becomes 22 nodes on one frame id; an Ethernet interface with N ports becomes a hub-and-spoke of N minus 1 sockets from its first port. That is a faithful rendering of what Teamcenter knows, and where Teamcenter knows less than vsiBuild needs (socket roles, frame layouts, signal types, timing) the generator assumes, says so in the assumptions file, and carries the gap forward rather than hiding it.
When a twin still does not fit
Narrow the scope with --exclude-blocks and --exclude-ports (regexes, everything dropped
is listed), or run a labelled diagnostic subset with --max-components whose header says it
is a subset. Do not raise the cap in the generator: vsiBuild will refuse the file, and a
refused file after a long generate is the expensive way to learn the limit.
Source: innexis-vsi/icd_to_vsi.py (--owners, --group-cap, merge rules), port_owners.py, README.md (EXERCISED 2026-09-05 and 2026-09-06) · retrieved Tue Sep 08 2026 00:00:00 GMT+0000 (Coordinated Universal Time)