diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java index c571236..feb0ab5 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java @@ -13,25 +13,73 @@ public class ChannelState { private DataTransferChannel channel; private Map> childrenMap; - private Map, Map> referenceStructure; + private ReferenceStructure referenceStructure; public ChannelState(DataTransferChannel channel) { this.channel = channel; } - public Map getDependentParams(Map channelParameters) { - Map dependentParams = new HashMap<>(); - if (referenceStructure != null) { - List channelParams = new ArrayList<>(); - for (Selector sel: channel.getAllSelectors()) { - channelParams.add(channelParameters.get(sel)); - } - for (Map.Entry paramEnt: referenceStructure.get(channelParams).entrySet()) { - dependentParams.put(paramEnt.getKey(), paramEnt.getValue()); - } + public DataTransferChannel getChannel() { + return channel; + } + + public Map getDependentParams(Map channelParameters) { + if (referenceStructure == null) { + return null; } - return dependentParams; + return referenceStructure.getDependentParams(channelParameters); } + public void addDependantParam(Map channelParameters, Expression variable, Expression value) { + referenceStructure.addDependantParam(channelParameters, variable, value); + } + private static class ReferenceStructure { + private Map dependentParams = null; + private Map referenceStructure; + + public Map getDependentParams() { + return dependentParams; + } + + public Map getDependentParams(Map channelParameters) { + ReferenceStructure subStructure = this; + for (Selector sel: channelParameters.keySet()) { + if (subStructure.getDependentParams() == null) { + subStructure = subStructure.getReferenceStructure(channelParameters.get(sel)); + } else { + return null; + } + } + return subStructure.getDependentParams(); + } + + public void addDependantParam(Expression variable, Expression value) { + if (dependentParams == null) { + dependentParams = new HashMap<>(); + } + dependentParams.put(variable, value); + } + + public void addDependantParam(Map channelParameters, Expression variable, Expression value) { + ReferenceStructure subStructure = this; + for (Selector sel: channelParameters.keySet()) { + Constant chParam = channelParameters.get(sel); + if (subStructure.referenceStructure == null) { + subStructure.referenceStructure = new HashMap<>(); + } + ReferenceStructure nextStructure = subStructure.referenceStructure.get(chParam); + if (nextStructure == null) { + nextStructure = new ReferenceStructure(); + subStructure.referenceStructure.put(chParam, nextStructure); + } + subStructure = nextStructure; + } + subStructure.addDependantParam(variable, value); + } + + public ReferenceStructure getReferenceStructure(Constant channelParam) { + return referenceStructure.get(channelParam); + } + } }