diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java index 2b2cd4f..9566dd6 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java @@ -31,8 +31,19 @@ // A resource to channel edge PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()); ResourceNode srcResNode = (ResourceNode) resToCh.getSource(); - ChannelNode chNode = (ChannelNode) resToCh.getDestination(); - for (Edge chToRes: chNode.getOutEdges()) { + ChannelNode directDstChNode = (ChannelNode) resToCh.getDestination(); + // Should take into account the channel hierarchy. + Set ancestorDstChannels = directDstChNode.getAncestors(); + Set descendantDstChannels = directDstChNode.getDescendants(); + Set outEdges = new HashSet<>(); + outEdges.addAll(directDstChNode.getOutEdges()); + for (ChannelNode ancestorDst: ancestorDstChannels) { + outEdges.addAll(ancestorDst.getOutEdges()); + } + for (ChannelNode descendantDst: descendantDstChannels) { + outEdges.addAll(descendantDst.getOutEdges()); + } + for (Edge chToRes: outEdges) { ResourceNode dstResNode = (ResourceNode) chToRes.getDestination(); if (!CodeGenerator.generatesComponent(srcResNode.getResourceHierarchy())) { srcResNode = srcResNode.getParent();