Hi ,
I’m new to SST framework and trying to build a very simple setup: a peer-to-peer network with two routers directly connected, each with one merlin.trafficgen endpoint. I’ve run into a LinkControl initialization error
Setup
- SST version: 14.1.0 (also reproduced on 15.x)
- Topology: 2 routers using
merlin.mesh (shape 2:1)
- Each router has 1 local port connected to a
trafficgen endpoint
- Routers are directly connected to each other
here is the network graph created by sst with graphViz:

Error
I consistently get the following fatal error during initialization:
Error during LinkControl protocol initialization. The most likely cause of this is connecting an endpoint to a router port expecting to be connected to another router.
full stack trace:
error:
FATAL: Rank: 0,0, time: 0 - called in file: interfaces/linkControl.cc, line: 224, function: init
Element name: endpoint1, type: merlin.linkcontrol (full type tree: merlin.trafficgen.merlin.linkcontrol)
Error during LinkControl protocol initialization. The most likely cause of this is connecting an endpoint to a router port expecting to be connnected to another router.
SST Fatal Backtrace Information:
0 : sst(_ZNK3SST6Output5fatalEjPKcS2_iS2_z+0x38a) [0x5ea0085400a6]
1 : sst(_ZNK3SST13BaseComponent6vfatalEjPKcS2_iS2_P13__va_list_tag+0x324) [0x5ea008461992]
2 : sst(_ZNK3SST13BaseComponent10sst_assertEbjPKcS2_iS2_z+0xf2) [0x5ea008461d3a]
3 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin11LinkControl17checkInitProtocolEPNS_5EventENS0_12RtrInitEvent8CommandsEjPKcS7_+0xaa) [0x7873b3e8a92a]
4 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin11LinkControl4initEj+0x249) [0x7873b3e8ab7d]
5 : /home/admin/sst-14-install/lib/sst-elements-library/libmerlin.so(_ZN3SST6Merlin10TrafficGen4initEj+0x3d) [0x7873b3e74097]
6 : sst(_ZN3SST15Simulation_impl10initializeEv+0xf1) [0x5ea0085791df]
7 : sst(+0x5390c8) [0x5ea0084060c8]
8 : sst(main+0x2237) [0x5ea008408943]
9 : /lib/x86_64-linux-gnu/libc.so.6(+0x2a1ca) [0x7873bbe2a1ca]
10 : /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x8b) [0x7873bbe2a28b]
11 : sst(_start+0x25) [0x5ea008403bb5]
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 1.
Debugging details
I traced the issue into LinkControl::checkInitProtocol():
- The code expects a
RtrInitEvent::REPORT_FLIT_SIZE
- However, the received event has command
REPORT_ID
- This causes the assertion to fail
Relevant snippet:
ev = rtr_link->recvUntimedData();
init_ev = checkInitProtocol(ev, RtrInitEvent::REPORT_FLIT_SIZE, CALL_INFO);
RtrInitEvent* LinkControl::checkInitProtocol(Event* ev, RtrInitEvent::Commands command, uint32_t line, const char* file, const char* func)
{
bool good = true;
RtrInitEvent* init_ev = nullptr;
// Check to make sure the event isn't null and that it is an init event
if ( nullptr == ev || static_cast<BaseRtrEvent*>(ev)->getType() != BaseRtrEvent::INITIALIZATION ) good = false;
if ( good ) {
init_ev = static_cast<RtrInitEvent*>(ev);
// Now check to make sure this is the right protocol event
if ( init_ev->command != command ) {
good = false;
}
}
sst_assert(good, line, file, func, 1, "Error during LinkControl protocol initialization. The most likely cause of this is connecting an endpoint to a router port expecting to be connnected to another router.\n");
return init_ev;
}
From what I understand, this suggests a mismatch in initialization protocol between components.
My current configuration
import sst
link_bw = "5GB/s"
flit_size = "72B"
lat = "1ns"
buf_size = "1440B"
router_params = {
"link_bw": link_bw,
"flit_size": flit_size,
"xbar_bw": "5GB/s",
"input_buf_size": buf_size,
"output_buf_size": buf_size,
"local_ports": 1,
"num_ports": 3,
"input_latency": "1ns",
"output_latency": "1ns",
"vn_remap": "linear",
"topology": "topology"
}
topo_params = {
"mesh.shape": "2:1",
"mesh.width": "1:1",
"mesh.local_ports": 1,
"network_name": "main_net"
}
routers = {}
for i in range(2):
rtr = sst.Component(f"router{i}", "merlin.hr_router")
rtr.addParams(router_params)
rtr.addParam("id", i)
topo = rtr.setSubComponent("topology", "merlin.mesh")
topo.addParams(topo_params)
ep = sst.Component(f"endpoint{i}", "merlin.trafficgen")
ep.addParams({
"id": i,
"num_peers": 2,
"num_vns": 1,
"link_bw": "5GB/s",
"topology": "topology",
"packet_size": "256B",
"PacketDest.pattern": "Uniform",
"PacketSize.pattern": "Uniform",
"PacketDelay.pattern": "Uniform"
})
ep_topo = ep.setSubComponent("topology", "merlin.mesh")
ep_topo.addParams(topo_params)
link_host = sst.Link(f"link_host{i}")
link_host.connect((ep, "rtr", lat), (rtr, "port0", lat))
routers[i] = rtr
link_inter = sst.Link("inter_router_link")
link_inter.connect(
(routers[0], "port1", lat),
(routers[1], "port1", lat)
)
link_inter_back = sst.Link("inter_router_link_back")
link_inter_back.connect(
(routers[1], "port2", lat),
(routers[0], "port2", lat)
)
What I’ve tried
- Verified parameters using
sst-info
- Tested on both SST 15.x (latest master branch from GitHub) and v14.1.0
- Stepped through initialization to confirm the protocol mismatch (
REPORT_ID vs REPORT_FLIT_SIZE)
- Tried enabling/disabling explicit
linkcontrol subcomponent (commented section in code)
Questions
-
Is my component wiring correct?
Specifically, is it valid to directly connect trafficgen → router port like this, or is an explicit merlin.linkcontrol subcomponent required?
-
Are the router ports configured correctly?
I’m unsure if ports 1 and 2 are being interpreted as router-to-router links correctly in this setup.
-
Does this error indicate a topology mismatch?
Could the merlin.mesh topology be expecting different connectivity than what I’ve manually wired?
-
Is there any required initialization ordering or synchronization
for LinkControl that I might be missing, or is this purely a configuration issue?
-
Is there a minimal working example
of a 2-node Merlin network with trafficgen endpoints that I can compare against?
I’d really appreciate any guidance on whether this is a configuration issue or a misunderstanding of how Merlin components should be connected. I’ve tried to debug the initialization path before posting, but I may be missing something fundamental.
Thanks in advance for your help!
Hi ,
I’m new to SST framework and trying to build a very simple setup: a peer-to-peer network with two routers directly connected, each with one
merlin.trafficgenendpoint. I’ve run into aLinkControlinitialization errorSetup
merlin.mesh(shape2:1)trafficgenendpointhere is the network graph created by sst with graphViz:

Error
I consistently get the following fatal error during initialization:
full stack trace:
error:
Debugging details
I traced the issue into
LinkControl::checkInitProtocol():RtrInitEvent::REPORT_FLIT_SIZEREPORT_IDRelevant snippet:
From what I understand, this suggests a mismatch in initialization protocol between components.
My current configuration
What I’ve tried
sst-infoREPORT_IDvsREPORT_FLIT_SIZE)linkcontrolsubcomponent (commented section in code)Questions
Is my component wiring correct?
Specifically, is it valid to directly connect
trafficgen→ router port like this, or is an explicitmerlin.linkcontrolsubcomponent required?Are the router ports configured correctly?
I’m unsure if ports 1 and 2 are being interpreted as router-to-router links correctly in this setup.
Does this error indicate a topology mismatch?
Could the
merlin.meshtopology be expecting different connectivity than what I’ve manually wired?Is there any required initialization ordering or synchronization
for
LinkControlthat I might be missing, or is this purely a configuration issue?Is there a minimal working example
of a 2-node Merlin network with
trafficgenendpoints that I can compare against?I’d really appreciate any guidance on whether this is a configuration issue or a misunderstanding of how Merlin components should be connected. I’ve tried to debug the initialization path before posting, but I may be missing something fundamental.
Thanks in advance for your help!