nextUniverse = new LinkedHashMap<Input, InstanceInput>(nextUniverse);
if(!coupledInputs){
nextUniverse.put(originInput, new InstanceInput(this, originInput, nextValue, refInstanceOutput));
} else {
for(String ciName : coupledInputsFor(originInput.name())){
// we are only coupling multi inputs
if(!(input(ciName) instanceof MultiInput))
throw new IllegalStateException(" can't couple non multiple inputs");
MultiInput coupledMi = (MultiInput) input(ciName);
if(coupledMi.inputs().size() != ((MultiInput)originInput).inputs().size())
throw new IllegalStateException("These multiple inputs have different length and can't be coupled");
// Raw inputs can only be coupled with another reference input
if(!(coupledMi.inputs().get(idx) instanceof ReferenceInput))
throw new IllegalStateException(" Reference can only be paired with another reference ");
ReferenceInput ri = (ReferenceInput) coupledMi.inputs().get(idx);
if(!(ri.reference().module().equals(curMultiRefInput.reference().module())))
throw new IllegalStateException(" Reference can only be paired with another reference from the same module");
// We are selecting next avlue from the same module instance
InstanceOutput refIO = curModuleInstance.output(ri.reference().name());
nextValue = refIO.value();
//System.out.println("Assigning "+ri.reference().module().name()+"."+ri.reference().name()+" into "+name()+"."+coupledMi.name());
nextUniverse.put(coupledMi, new InstanceInput(this, coupledMi, nextValue, refIO));
}
}
instantiateInputRec( nextUniverse, depth+1);
} else {
// Can't handle multi valued coupled inputs
for(Object v : (List<Object>)nextValue){
nextUniverse = new LinkedHashMap<Input, InstanceInput>(nextUniverse);
nextUniverse.put(originInput, new InstanceInput(this, originInput, v, refInstanceOutput));
instantiateInputRec( nextUniverse, depth+1);
}
}