diff --git a/src/main/java/cli/PatternHandling.java b/src/main/java/cli/PatternHandling.java index b3b7ebe2113021db3919f8d4d37d8b4afa3e248a..029e1d231c6a72cbd04ab19ff7a9f59d9562e925 100644 --- a/src/main/java/cli/PatternHandling.java +++ b/src/main/java/cli/PatternHandling.java @@ -1,6 +1,9 @@ package cli; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -8,12 +11,18 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Vector; + +import myutil.TraceManager; +import tmltranslator.HwNode; +import tmltranslator.TMLChannel; +import tmltranslator.TMLEvent; import tmltranslator.TMLMapping; import tmltranslator.TMLMappingTextSpecification; -import tmltranslator.TMLModeling; +import tmltranslator.TMLRequest; import tmltranslator.TMLTask; import tmltranslator.patternhandling.AttributeTaskJsonFile; import tmltranslator.patternhandling.MappingPatternChannel; +import tmltranslator.patternhandling.MappingPatternTask; import tmltranslator.patternhandling.PatternChannelWithSecurity; import tmltranslator.patternhandling.PatternCloneTask; import tmltranslator.patternhandling.PatternConfiguration; @@ -43,16 +52,24 @@ public class PatternHandling extends Command { private final static String TASK_TO_CLONE_NOT_EXIST = "Task to clone does not exist"; private final static String TASK_NOT_EXIST = "Task does not exist"; private final static String PATTERN_TASK_NOT_EXIST = "Pattern task does not exist or all its external ports are already connected"; - private final static String PATTERN_PORT_NOT_EXIST = "Pattern port does not exist or its already connected"; + private final static String PATTERN_PORT_NOT_EXIST = "Pattern port does not exist or it's already connected"; private final static String MODEL_TASK_NOT_EXIST = "Model task does not exist"; private final static String MODEL_PORT_NOT_EXIST = "Model port does not exist or its already used"; + private final static String MODEL_PORT_CONFIG_NOT_EXIST = "Model port does not exist or it's already configured"; + private final static String MODEL_PORT_MERGE_WITH_NOT_EXIST = "Model port to merge with does not exist or can't be used"; private final static String PORTS_TYPES_NOT_MATCH = "The selected port in pattern side does not match with the selected port in the model side"; private final static String ATTRIBUTE_NOT_EXIST = "Attribute does not exist"; private final static String VALUE_BAD = "Unreadable value"; + private final static String TASK_TO_MAP_NOT_EXIST = "Task to map does not exist or it's already mapped"; + private final static String TASK_IN_SAME_HW_MAP_NOT_EXIST = "Selected task in same HW does not exist or can't be used"; + private final static String CHANNEL_TO_MAP_NOT_EXIST = "Channel to map does not exist or it's already mapped"; + private final static String CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST = "Selected channel in same memory does not exist or can't be used"; + private final static String BUS_NOT_EXIST = "Bus does not exist"; + private final static String CONFIG_JSON_FILE_NOT_EXIST = "Config json file does not exist"; // PatternHandling commands - private final static String CREATE = "create"; - private final static String CONFIGURE = "select-configure"; - private final static String INTEGRATE = "integrate"; + private final static String CREATE = "create-pattern"; + private final static String CONFIGURE = "configure-pattern"; + private final static String INTEGRATE = "apply-pattern"; private final static String DIPLO_LOAD_TMAP = "diplodocus-load-tmap"; private TMLMapping<?> tmap; @@ -64,9 +81,14 @@ public class PatternHandling extends Command { private String selectedPatternPath, selectedPatternName; private PatternConfiguration patternConfiguration = new PatternConfiguration(); LinkedHashMap<String, TaskPattern> patternTasksAll, patternTasksLeft; - LinkedHashMap<String, TaskPorts> portsTaskOfModelAll;// = new LinkedHashMap<String, TaskPorts>(); - LinkedHashMap<String, TaskPorts> portsTaskModelLeft;// = new LinkedHashMap<String, TaskPorts>(); - + LinkedHashMap<String, TaskPorts> portsTaskOfModelAll = new LinkedHashMap<String, TaskPorts>(); + LinkedHashMap<String, TaskPorts> portsTaskModelLeft; + List<PatternPortsConfig> portsLeftToConfig; + List<MappingPatternTask> tasksLeftToMap; + List<MappingPatternChannel> channelsLeftToMap; + + private String selectedPatternToIntergrate, selectedJsonFilePath; + public PatternHandling() { } @@ -247,7 +269,7 @@ public class PatternHandling extends Command { // Create Pattern Command configurePattern = new Command() { - final String [] options = {"-s", "-p", "-sp", "-ct", "-ctr", "-co", "-cor", "-col", "-plnc", "-pl", "-t", "-cpl", "-cpd","-cpm","-cpr","-tcl","-tcm", "-tcn", "-tcr", "-mcl", "-mcm", "-mcn", "-mcr", "-ua", "-m"}; + final String [] options = {"-s", "-p", "-sp", "-ct", "-ctr", "-co", "-cor", "-col", "-plnc", "-pl", "-t", "-cptl", "-cpd", "-cpm", "-cpml", "-cpr", "-cpl", "-tctl", "-tcm", "-tcml", "-tcn", "-tcr", "-tcl", "-mctl", "-mcm", "-mcml", "-mcn", "-mcr", "-mcl", "-ua", "-m"}; public String getCommand() { return CONFIGURE; } @@ -274,18 +296,24 @@ public class PatternHandling extends Command { + "-plnc \tget the list of pattern's ports that are not yet connected\n" + "-pl TASK.PORT \tget list of available ports in model that could be used to connect with PORT (pattern side)\n" + "-t \tget all tasks of the model\n" - + "-cpl \tget list of ports to be configured\n" + + "-cptl \tget list of ports to be configured\n" + "-cpd [TASK.PORT] [ALL]\tchoose removing PORT as decision (or ALL to remove all the ports)\n" + "-cpm TASK.PORT1 PORT2\tchoose merging PORT1 with PORT2 as decision\n" + + "-cpml TASK.PORT\tget list of ports that can be merge with TASK.PORT\n" + "-cpr TASK.PORT\tremove the configuration decision for PORT\n" - + "-tcl \tget list of tasks to be mapped \n" + + "-cpl \tget list of configured ports\n" + + "-tctl \tget list of tasks to be mapped \n" + "-tcm TASK1 TASK2\tmap TASK1 in same CPU as TASK2\n" + + "-tcml\tmap get list of tasks that can be used to map in same CPU\n" + "-tcn TASK BUS\tmap TASK in new CPU linked to bus BUS\n" + "-tcr TASK\tremove the mapping of TASK\n" - + "-mcl \tmap get list of channels to be mapped \n" + + "-tcl \tget list of mapped tasks\n" + + "-mctl \tmap get list of channels to be mapped\n" + "-mcm TASK1.CHANNEL1 TASK2.CHANNEL2\tmap CHANNEL1 in same memory and buses as CHANNEL2\n" + + "-mcml\tmap get list of channels that can be used to map in same Memory\n" + "-mcn TASK.CHANNEL BUS\tmap CHANNEL in new memory linked to bus BUS\n" + "-mcr TASK.CHANNEL\tremove the mapping of CHANNEL\n" + + "-mcl \tmap get list of mapped channels\n" + "-ua TASK ATTRIBUTE VALUE \tput the value VALUE of attribute ATTRIBUTE of the task TASK\n" + "-m \tmake the configuration of the pattern\n"; } @@ -304,7 +332,21 @@ public class PatternHandling extends Command { for (TMLTask task : tmap.getTMLModeling().getTasks()) { String[] taskNameSplit = task.getName().split("__"); allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + task.setName(taskNameSplit[taskNameSplit.length-1]); + } + for (TMLChannel ch : tmap.getTMLModeling().getChannels()) { + String[] chNameSplit = ch.getName().split("__"); + ch.setName(chNameSplit[chNameSplit.length-1]); } + for (TMLEvent evt : tmap.getTMLModeling().getEvents()) { + String[] evtNameSplit = evt.getName().split("__"); + evt.setName(evtNameSplit[evtNameSplit.length-1]); + } + for (TMLRequest req : tmap.getTMLModeling().getRequests()) { + String[] reqNameSplit = req.getName().split("__"); + req.setName(reqNameSplit[reqNameSplit.length-1]); + } + } } @@ -324,10 +366,8 @@ public class PatternHandling extends Command { listPatterns = getFoldersName(patternsPath); if (listPatterns.contains(argumentsOfOption.get(0))) { selectedPatternName = argumentsOfOption.get(0); - patternTasksAll = TaskPattern.parsePatternJsonFile(patternsPath+"/"+patternName, patternName+".json"); - //patternTasksLeft = TaskPattern.parsePatternJsonFile(patternsPath+"/"+patternName, patternName+".json"); + patternTasksAll = TaskPattern.parsePatternJsonFile(patternsPath+selectedPatternName, selectedPatternName+".json"); portsTaskOfModelAll = TaskPorts.getListPortsTask(tmap.getTMLModeling()); - //portsTaskOfModelLeft = TaskPorts.getListPortsTask(tmap.getTMLModeling()); } else { //selectedPatternName = null; return PATTERN_NOT_EXIST; @@ -391,7 +431,9 @@ public class PatternHandling extends Command { PatternCloneTask patterClone = new PatternCloneTask(clonedTask, selectedTaskToClone); patternConfiguration.addClonedTasks(patterClone); - + for (String t : portsTaskOfModelAll.keySet()) { + TraceManager.addDev("t =" + t ); + } //portsTaskOfModelLeft.put(clonedTask, TaskPorts.cloneTaskPort(portsTaskOfModelAll.get(selectedTaskToClone))); portsTaskOfModelAll.put(clonedTask, TaskPorts.cloneTaskPort(portsTaskOfModelAll.get(selectedTaskToClone))); @@ -459,7 +501,7 @@ public class PatternHandling extends Command { int auth = -1; for (int ind = 0; ind < argumentsOfOption.size(); ind++) { if (ind == 0) { - String[] taskPort = argumentsOfOption.get(ind).split("."); + String[] taskPort = argumentsOfOption.get(ind).split("\\."); if (taskPort.length == 2) { patternTask = taskPort[0]; patternPort = taskPort[1]; @@ -467,7 +509,7 @@ public class PatternHandling extends Command { return Interpreter.BAD; } } else if (ind == 1) { - String[] taskPort = argumentsOfOption.get(ind).split("."); + String[] taskPort = argumentsOfOption.get(ind).split("\\."); if (taskPort.length == 2) { modelTask = taskPort[0]; modelPort = taskPort[1]; @@ -505,22 +547,25 @@ public class PatternHandling extends Command { } else { return MODEL_TASK_NOT_EXIST; } - if (portModelType == 0) { + if (portModelType == 0 && !isNewPort) { return MODEL_PORT_NOT_EXIST; } boolean samePortType = false; - if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.WRITE_CHANNEL) { - samePortType = true; - } else if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.READ_CHANNEL) { - samePortType = true; - } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.SEND_EVENT) { - samePortType = true; - } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.WAIT_EVENT) { - samePortType = true; - } else { - return PORTS_TYPES_NOT_MATCH; + if (!isNewPort) { + if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.WRITE_CHANNEL) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.CHANNEL) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.READ_CHANNEL) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_INPUT) && portModelType == TaskPorts.SEND_EVENT) { + samePortType = true; + } else if (portPattern.getType().equals(PatternCreation.EVENT) && portPattern.getMode().equals(PatternCreation.MODE_OUTPUT) && portModelType == TaskPorts.WAIT_EVENT) { + samePortType = true; + } else { + return PORTS_TYPES_NOT_MATCH; + } } - if (samePortType) { + + if (samePortType || isNewPort) { if (isConf) { portPattern.setConfidentiality(PatternCreation.WITH_CONFIDENTIALITY); } @@ -568,7 +613,7 @@ public class PatternHandling extends Command { List<PatternConnection> patternConnectionsToRemove = new ArrayList<PatternConnection>(); for (String argumentOfOption : argumentsOfOption) { String patternTaskToRemove = null, patternPortToRemove = null; - String[] taskPortToRemove = argumentOfOption.split("."); + String[] taskPortToRemove = argumentOfOption.split("\\."); boolean taskPortExist = false; if (taskPortToRemove.length == 2) { patternTaskToRemove = taskPortToRemove[0]; @@ -610,6 +655,9 @@ public class PatternHandling extends Command { argumentsOfOption.add(commands[i+1]); i += 1; } + for (String arg : argumentsOfOption) { + TraceManager.addDev("arg=" + arg); + } if (argumentsOfOption.size() != 1) { return Interpreter.BAD; } @@ -617,13 +665,16 @@ public class PatternHandling extends Command { return NO_PATTERN_SELECTED; } String patternTaskSelected = null, patternPortSelected = null; - String[] taskPort = argumentsOfOption.get(0).split("."); + String[] taskPort = argumentsOfOption.get(0).split("\\."); + TraceManager.addDev("taskPort.length=" + taskPort.length); if (taskPort.length == 2) { patternTaskSelected = taskPort[0]; patternPortSelected = taskPort[1]; } else { return Interpreter.BAD; } + TraceManager.addDev("patternTaskSelected=" +patternTaskSelected); + TraceManager.addDev("patternPortSelected=" +patternPortSelected); patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); PortTaskJsonFile portPatternSelected; @@ -676,7 +727,7 @@ public class PatternHandling extends Command { } interpreter.print(printTasks); break; - case "-cpl": + case "-cptl": while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { argumentsOfOption.add(commands[i+1]); i += 1; @@ -684,32 +735,67 @@ public class PatternHandling extends Command { if (argumentsOfOption.size() != 0) { return Interpreter.BAD; } - patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { return PATTERN_NOT_CONNECTED; } - List<String> clonedTasksAll = new ArrayList<String>(); - for (PatternCloneTask cloneT : patternConfiguration.getClonedTasks()) { - clonedTasksAll.add(cloneT.getClonedTask()); - } + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); - List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, clonedTasksAll, tmap.getTMLModeling()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); interpreter.print("The ports that need to be configured are :"); - for (PatternPortsConfig portToConfig : portsToConfig) { - boolean isToConfig = true; - for (PatternPortsConfig portConfigured : patternConfiguration.getPortsConfig()) { - if (portToConfig.getTaskOfChannelToConfig().equals(portConfigured.getTaskOfChannelToConfig()) && portToConfig.getChannelToConfig().equals(portConfigured.getChannelToConfig())) { - isToConfig = false; - break; + for (PatternPortsConfig portToConfig : portsLeftToConfig) { + interpreter.print(portToConfig.getTaskOfChannelToConfig() + "." + portToConfig.getChannelToConfig()); + } + + break; + case "-cpd": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + for (String argumentOfOption : argumentsOfOption) { + if (argumentOfOption.equals("ALL")) { + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + for (PatternPortsConfig portConfig : portsLeftToConfig) { + portConfig.setIsChannelToRemove(true); + patternConfiguration.getPortsConfig().add(portConfig); + } + } else { + String modelTaskToConfig = null, modelPortToConfig = null; + String[] taskPortToConfig = argumentOfOption.split("\\."); + if (taskPortToConfig.length == 2) { + modelTaskToConfig = taskPortToConfig[0]; + modelPortToConfig = taskPortToConfig[1]; + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + boolean isConfigured = false; + for (PatternPortsConfig portConfig : portsLeftToConfig) { + if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) { + portConfig.setIsChannelToRemove(true); + patternConfiguration.getPortsConfig().add(portConfig); + isConfigured = true; + break; + } + } + if (!isConfigured) { + return MODEL_PORT_CONFIG_NOT_EXIST; + } + } else { + return Interpreter.BAD; } - } - if (isToConfig) { - interpreter.print(portToConfig.getTaskOfChannelToConfig() + "." + portToConfig.getChannelToConfig()); } } - break; - case "-mcm": + break; + case "-cpm": while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { argumentsOfOption.add(commands[i+1]); i += 1; @@ -717,47 +803,496 @@ public class PatternHandling extends Command { if (argumentsOfOption.size() != 2) { return Interpreter.BAD; } - if (selectedPatternName == null) { - return NO_PATTERN_SELECTED; + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; } - String taskOfChannelToMap; - String channelToMap; - int origin = MappingPatternChannel.ORIGIN_CLONE; - String[] taskChannelToMap = argumentsOfOption.get(0).split("."); - if (taskChannelToMap.length == 2) { - taskOfChannelToMap = taskChannelToMap[0]; - channelToMap = taskChannelToMap[1]; - } else { + PatternPortsConfig portToConfig = null; + String modelTaskToConfig = null, modelPortToConfig = null; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + if (ind == 0) { + String[] taskPortToConfig = argumentsOfOption.get(ind).split("\\."); + if (taskPortToConfig.length == 2) { + modelTaskToConfig = taskPortToConfig[0]; + modelPortToConfig = taskPortToConfig[1]; + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + boolean isConfigured = false; + for (PatternPortsConfig portConfig : portsLeftToConfig) { + if (portConfig.getTaskOfChannelToConfig().equals(modelTaskToConfig) && portConfig.getChannelToConfig().equals(modelPortToConfig)) { + portToConfig = portConfig; + isConfigured = true; + break; + } + } + if (!isConfigured) { + return MODEL_PORT_CONFIG_NOT_EXIST; + } + } else { + return Interpreter.BAD; + } + } else if (ind == 1) { + if (portToConfig != null) { + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling()); + List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, modelTaskToConfig); + if (portsCanBeMergedWith.contains(argumentsOfOption.get(ind))) { + portToConfig.setMergeWith(argumentsOfOption.get(ind)); + patternConfiguration.getPortsConfig().add(portToConfig); + } else { + return MODEL_PORT_MERGE_WITH_NOT_EXIST; + } + } + } + } + break; + case "-cpml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { return Interpreter.BAD; } - String taskOfChannelSameHw; - String channelSameHw; - String[] taskChannelSameHw = argumentsOfOption.get(1).split("."); - if (taskChannelSameHw.length == 2) { - taskOfChannelSameHw = taskChannelSameHw[0]; - channelSameHw = taskChannelSameHw[1]; + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] taskPortToConfig = argumentsOfOption.get(0).split("\\."); + if (taskPortToConfig.length == 2) { + if (!portsTaskOfModelAll.containsKey(taskPortToConfig[0])) { + return TASK_NOT_EXIST; + } + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), tmap.getTMLModeling()); + List<String> portsCanBeMergedWith = PatternPortsConfig.getPortsCanBeMergedWith(portsTaskOfModelAll, portsToConfig, taskPortToConfig[0]); + interpreter.print("List of ports that can be merge with " + taskPortToConfig[0] +"." + taskPortToConfig[1] +":"); + for (String portCanBeMergedWith : portsCanBeMergedWith) { + interpreter.print(portCanBeMergedWith); + } } else { return Interpreter.BAD; } - for (String patternName : patternTasksAll.keySet()) { - if (patternName.equals(taskOfChannelToMap)) { - for (PortTaskJsonFile port : patternTasksAll.get(patternName).getInternalPorts()) { - if (port.getName().equals(channelToMap)) { - origin = MappingPatternChannel.ORIGIN_PATTERN; + break; + case "-cpr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<PatternPortsConfig> patternPortsConfigToRemove = new ArrayList<PatternPortsConfig>(); + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + String[] taskPortToRemove = argumentsOfOption.get(ind).split("\\."); + if (taskPortToRemove.length == 2) { + boolean isPortConfigToRemoveExist = false; + for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) { + if (patternPortsConfig.getTaskOfChannelToConfig().equals(taskPortToRemove[0]) && patternPortsConfig.getChannelToConfig().equals(taskPortToRemove[1])) { + patternPortsConfigToRemove.add(patternPortsConfig); + isPortConfigToRemoveExist = true; break; } } - for (PortTaskJsonFile port : patternTasksAll.get(patternName).getExternalPorts()) { - if (port.getName().equals(channelToMap)) { - origin = MappingPatternChannel.ORIGIN_PATTERN; - break; - } + if (!isPortConfigToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } else { + interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD); + } + } + patternConfiguration.getPortsConfig().removeAll(patternPortsConfigToRemove); + break; + case "-cpl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("List of configured ports:"); + for (PatternPortsConfig patternPortsConfig : patternConfiguration.getPortsConfig()) { + interpreter.print(patternPortsConfig.getStringDisplay()); + } + break; + case "-tctl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName())); + interpreter.print("The tasks that need to be mapped are :"); + for (MappingPatternTask taskMap : tasksLeftToMap) { + interpreter.print(taskMap.getTaskToMapName()); + } + break; + case "-tcm": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternTask> allTasksToMap = MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName()); + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), allTasksToMap); + boolean taskToMapExist = false; + MappingPatternTask taskToMap = null; + for (MappingPatternTask taskMap : tasksLeftToMap) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) { + taskToMap = taskMap; + taskToMapExist = true; + break; + } + } + if (!taskToMapExist) { + return TASK_TO_MAP_NOT_EXIST; + } + boolean taskSameHwExist = false; + int originSameTask = 0; + if (allTasksOfModel.contains(argumentsOfOption.get(1))) { + taskSameHwExist = true; + originSameTask = MappingPatternTask.ORIGIN_MODEL; + } + if (!taskSameHwExist) { + for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(1))) { + taskSameHwExist = true; + originSameTask = taskMap.getOrigin(); + break; } } } - MappingPatternChannel channelMapping = new MappingPatternChannel(taskOfChannelToMap, channelToMap, origin); - channelMapping.setTaskAndChannelInSameMem(taskOfChannelSameHw, channelSameHw, i); - patternConfiguration.addChannelsMapping(channelMapping); + if (!taskSameHwExist) { + return TASK_IN_SAME_HW_MAP_NOT_EXIST; + } + if (taskSameHwExist && taskToMapExist) { + taskToMap.setSameHwAs(argumentsOfOption.get(1), originSameTask); + patternConfiguration.getTasksMapping().add(taskToMap); + } + break; + case "-tcml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("The list of tasks that can be used to map in same CPU:"); + for (String taskMap : allTasksOfModel) { + interpreter.print(taskMap); + } + for (MappingPatternTask taskMap : patternConfiguration.getTasksMapping()) { + interpreter.print(taskMap.getTaskToMapName()); + } + break; + case "-tcn": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + tasksLeftToMap = MappingPatternTask.getTasksLeftToMap(patternConfiguration.getTasksMapping(), MappingPatternTask.getTasksToMap(patternTasksAll, patternConfiguration.getClonedTasksName())); + boolean taskToMapInNewCPUExist = false; + MappingPatternTask taskToMapInNewCPU = null; + for (MappingPatternTask taskMap : tasksLeftToMap) { + if (taskMap.getTaskToMapName().equals(argumentsOfOption.get(0))) { + taskToMapInNewCPU = taskMap; + taskToMapInNewCPUExist = true; + break; + } + } + if (!taskToMapInNewCPUExist) { + return TASK_TO_MAP_NOT_EXIST; + } + boolean busNewCPUExist = false; + for (HwNode bus : tmap.getArch().getBUSs()) { + if (bus.getName().equals(argumentsOfOption.get(1))) { + busNewCPUExist = true; + break; + } + } + if (!busNewCPUExist) { + return BUS_NOT_EXIST; + } + if (taskToMapInNewCPUExist && busNewCPUExist) { + taskToMapInNewCPU.setBusNameForNewHw(argumentsOfOption.get(1)); + patternConfiguration.getTasksMapping().add(taskToMapInNewCPU); + } + break; + case "-tcr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternTask> mappingTasksToRemove = new ArrayList<MappingPatternTask>(); + boolean isMappingTaskToRemoveExist = false; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) { + if (mappingTask.getTaskToMapName().equals(argumentsOfOption.get(ind))) { + mappingTasksToRemove.add(mappingTask); + isMappingTaskToRemoveExist = true; + break; + } + } + if (!isMappingTaskToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } + patternConfiguration.getTasksMapping().removeAll(mappingTasksToRemove); + break; + case "-tcl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("list of mapped tasks:"); + for (MappingPatternTask mappingTask : patternConfiguration.getTasksMapping()) { + interpreter.print(mappingTask.getStringDisplay()); + } + break; + case "-mctl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks())); + interpreter.print("The channels that need to be mapped are :"); + for (MappingPatternChannel channelMap : channelsLeftToMap) { + interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName()); + } + break; + case "-mcm": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] channelTaskToMap = argumentsOfOption.get(0).split("\\."); + if (channelTaskToMap.length != 2) { + return argumentsOfOption.get(0) + ": " + Interpreter.BAD; + } + String[] channelTaskSameMem = argumentsOfOption.get(1).split("\\."); + if (channelTaskSameMem.length != 2) { + return argumentsOfOption.get(1) + ": " + Interpreter.BAD; + } + List<MappingPatternChannel> allChannelsToMap = MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks()); + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), allChannelsToMap); + boolean channelToMapExist = false; + MappingPatternChannel channelToMap = null; + for (MappingPatternChannel channelMap : channelsLeftToMap) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMap[0]) && channelMap.getChannelToMapName().equals(channelTaskToMap[1])) { + channelToMap = channelMap; + channelToMapExist = true; + break; + } + } + if (!channelToMapExist) { + return CHANNEL_TO_MAP_NOT_EXIST; + } + boolean channelSameHwExist = false; + int originSameChannel = 0; + for(String st : portsTaskOfModelAll.keySet()) { + if (!patternConfiguration.getClonedTasksName().contains(st)) { + for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) { + if (st.equals(channelTaskSameMem[0]) && wc.equals(channelTaskSameMem[1])) { + originSameChannel = MappingPatternTask.ORIGIN_MODEL; + channelSameHwExist = true; + } + } + } + } + if (!channelSameHwExist) { + for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskSameMem[0]) && channelMap.getChannelToMapName().equals(channelTaskSameMem[1])) { + channelSameHwExist = true; + originSameChannel = channelMap.getOrigin(); + break; + } + } + } + if (!channelSameHwExist) { + return CHANNEL_IN_SAME_MEM_MAP_NOT_EXIST; + } + if (channelSameHwExist && channelToMapExist) { + channelToMap.setTaskAndChannelInSameMem(channelTaskSameMem[0], channelTaskSameMem[1], originSameChannel); + patternConfiguration.getChannelsMapping().add(channelToMap); + } + break; + case "-mcml": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("The list of channels that can be used to map in same memory:"); + for(String st : portsTaskOfModelAll.keySet()) { + if (!patternConfiguration.getClonedTasksName().contains(st)) { + for (String wc : portsTaskOfModelAll.get(st).getWriteChannels()) { + interpreter.print(st + "." + wc); + } + } + } + for (MappingPatternChannel channelMap : patternConfiguration.getChannelsMapping()) { + interpreter.print(channelMap.getTaskOfChannelToMap() + "." + channelMap.getChannelToMapName()); + } + break; + case "-mcn": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 2) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + String[] channelTaskToMapNew = argumentsOfOption.get(0).split("\\."); + if (channelTaskToMapNew.length != 2) { + return argumentsOfOption.get(0) + ": " + Interpreter.BAD; + } + channelsLeftToMap = MappingPatternChannel.getChannelsLeftToMap(patternConfiguration.getChannelsMapping(), MappingPatternChannel.getChannelsToMap(patternConfiguration.getPortsConnection(), patternTasksAll,patternConfiguration.getClonedTasks())); + boolean channelToMapInNewMemExist = false; + MappingPatternChannel channelToMapInNewMem = null; + for (MappingPatternChannel channelMap : channelsLeftToMap) { + if (channelMap.getTaskOfChannelToMap().equals(channelTaskToMapNew[0]) && channelMap.getChannelToMapName().equals(channelTaskToMapNew[1])) { + channelToMapInNewMem = channelMap; + channelToMapInNewMemExist = true; + break; + } + } + if (!channelToMapInNewMemExist) { + return CHANNEL_TO_MAP_NOT_EXIST; + } + boolean busNewMemExist = false; + for (HwNode bus : tmap.getArch().getBUSs()) { + if (bus.getName().equals(argumentsOfOption.get(1))) { + busNewMemExist = true; + break; + } + } + if (!busNewMemExist) { + return BUS_NOT_EXIST; + } + if (channelToMapInNewMemExist && busNewMemExist) { + channelToMapInNewMem.setBusNameForNewMem(argumentsOfOption.get(1)); + patternConfiguration.getChannelsMapping().add(channelToMapInNewMem); + } + break; + case "-mcr": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() == 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + List<MappingPatternChannel> mappingChannelsToRemove = new ArrayList<MappingPatternChannel>(); + boolean isMappingChannelToRemoveExist = false; + for (int ind = 0; ind < argumentsOfOption.size(); ind++) { + String[] channelTaskToRem = argumentsOfOption.get(ind).split("\\."); + if (channelTaskToRem.length != 2) { + interpreter.print(argumentsOfOption.get(ind) + ": " + Interpreter.BAD); + break; + } + for (MappingPatternChannel mappingChannel : patternConfiguration.getChannelsMapping()) { + if (mappingChannel.getTaskOfChannelToMap().equals(channelTaskToRem[0]) && mappingChannel.getChannelToMapName().equals(channelTaskToRem[1])) { + mappingChannelsToRemove.add(mappingChannel); + isMappingChannelToRemoveExist = true; + break; + } + } + if (!isMappingChannelToRemoveExist) { + interpreter.print(argumentsOfOption.get(ind) + " does not exist, it will not be removed."); + } + } + patternConfiguration.getChannelsMapping().removeAll(mappingChannelsToRemove); + break; + case "-mcl": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + interpreter.print("list of mapped channels:"); + for (MappingPatternChannel mappedChannel : patternConfiguration.getChannelsMapping()) { + interpreter.print(mappedChannel.getStringDisplay()); + } break; case "-ua": while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { @@ -816,7 +1351,17 @@ public class PatternHandling extends Command { if (argumentsOfOption.size() != 0) { return Interpreter.BAD; } - if (patternName != null && !patternName.equals("") && selectedTasks.size() != 0) { + patternTasksLeft = TaskPattern.getPatternTasksLeft(patternTasksAll, patternConfiguration.getPortsConnection()); + if (patternTasksLeft.keySet().size() != 0) { + return PATTERN_NOT_CONNECTED; + } + portsTaskModelLeft = TaskPorts.getPortsTaskOfModelLeft(portsTaskOfModelAll, patternConfiguration.getPortsConnection()); + portsLeftToConfig = PatternPortsConfig.getPortsLeftToConfig(portsTaskOfModelAll, portsTaskModelLeft, patternConfiguration.getClonedTasksName(), patternConfiguration.getPortsConfig(), tmap.getTMLModeling()); + if (portsLeftToConfig.size() != 0) { + return PORT_CONFIGURATION_NOT_FINISHED; + } + if (selectedPatternName != null && !selectedPatternName.equals("")) { + selectedPatternPath = patternsPath + selectedPatternName; interpreter.mgui.gtm.createJsonPatternConfigFile(selectedPatternPath, selectedPatternName, patternConfiguration); } else { return NO_NAME_NO_TASK_FOR_PATTERN; @@ -876,9 +1421,121 @@ public class PatternHandling extends Command { } }; + Command integratePattern = new Command() { + final String [] options = {"-l", "-n", "-p", "-m"}; + public String getCommand() { + return INTEGRATE; + } + + public String getShortCommand() { + return "a"; + } + public String getDescription() { + return "Inegrate a pattern to a model by giving a name to the pattern and the path of the configuration file"; + } + + public String getUsage() { + return "[OPTION]... [NAME] [PATH]\n" + + "-l NAME\tlist of available patterns\n" + + "-n NAME\tselect a pattern by its name\n" + + "-p PATH\tpath of the configuration json file\n" + + "-m \tmake the pattern\n"; + } + + public String executeCommand(String command, Interpreter interpreter) { + if (!interpreter.isTToolStarted()) { + return Interpreter.TTOOL_NOT_STARTED; + } + + if (tmap == null) { + tmap = interpreter.mgui.gtm.getTMLMapping(); + if (tmap == null) { + return Interpreter.TMAP_NO_SPEC + "\nLoad a TMAP Spec using " + DIPLO_LOAD_TMAP + " command or move to Arch tab."; + } else { + allTasksOfModel.clear(); + for (TMLTask task : tmap.getTMLModeling().getTasks()) { + String[] taskNameSplit = task.getName().split("__"); + allTasksOfModel.add(taskNameSplit[taskNameSplit.length-1]); + } + } + } + String[] commands = command.split(" "); + for (int i = 0; i < commands.length; i++) { + List<String> argumentsOfOption = new ArrayList<String>(); + switch (commands[i]) { + case "-l": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + interpreter.print("There is " + listPatterns.size() + " pattern(s):"); + int cont = 1; + for (String pattern : listPatterns) { + interpreter.print(cont + ". " + pattern); + cont++; + } + break; + case "-n": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + listPatterns = getFoldersName(patternsPath); + if (listPatterns.contains(argumentsOfOption.get(0))) { + selectedPatternToIntergrate = argumentsOfOption.get(0); + } else { + return PATTERN_NOT_EXIST; + } + break; + case "-p": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 1) { + return Interpreter.BAD; + } + Path path = Paths.get(argumentsOfOption.get(0)); + + if (Files.exists(path)) { + selectedJsonFilePath = argumentsOfOption.get(0); + } else { + return CONFIG_JSON_FILE_NOT_EXIST; + } + break; + case "-m": + while (i+1 < commands.length && !Arrays.asList(options).contains(commands[i+1])) { + argumentsOfOption.add(commands[i+1]); + i += 1; + } + if (argumentsOfOption.size() != 0) { + return Interpreter.BAD; + } + if (selectedJsonFilePath != null && selectedPatternToIntergrate != null) { + TraceManager.addDev("selectedJsonFilePath= " + selectedJsonFilePath); + TraceManager.addDev("selectedPatternToIntergrate= " + selectedPatternToIntergrate); + String selectedPatternPathToIntergrate = patternsPath + selectedPatternToIntergrate + "/"; + interpreter.mgui.gtm.integratePattern(interpreter.mgui, selectedPatternPathToIntergrate, selectedPatternToIntergrate, selectedJsonFilePath); + } + break; + default: + return Interpreter.BAD; + } + } + return null; + } + }; addAndSortSubcommand(createPattern); addAndSortSubcommand(configurePattern); + addAndSortSubcommand(integratePattern); addAndSortSubcommand(diplodocusLoadTMAP); } diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java index 8b9b18c66a1d13148f2808ae087d6b6850655749..10b420a7fb4b53a656c86ce1a05cc5bd6c48aa83 100644 --- a/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java +++ b/src/main/java/tmltranslator/patternhandling/MappingPatternChannel.java @@ -164,4 +164,21 @@ public class MappingPatternChannel { return mappingPatternChannels; } + + public static List<MappingPatternChannel> getChannelsLeftToMap(List<MappingPatternChannel> _mappedChannels, List<MappingPatternChannel> _allChannelsToMap) { + List<MappingPatternChannel> channelsLeftToMap = new ArrayList<MappingPatternChannel>(); + for (MappingPatternChannel channelToMap : _allChannelsToMap) { + boolean isLeftToMap = true; + for (MappingPatternChannel mappedChannel : _mappedChannels) { + if (channelToMap.getChannelToMapName().equals(mappedChannel.getChannelToMapName()) && channelToMap.getTaskOfChannelToMap().equals(mappedChannel.getTaskOfChannelToMap())) { + isLeftToMap = false; + break; + } + } + if (isLeftToMap) { + channelsLeftToMap.add(channelToMap); + } + } + return channelsLeftToMap; + } } diff --git a/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java index 96570ef84ab3b71434a3f424aec9915a5c90bc56..d0aa5619e9adff4c432e0c2d4e3e58683487fc57 100644 --- a/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java +++ b/src/main/java/tmltranslator/patternhandling/MappingPatternTask.java @@ -8,6 +8,10 @@ package tmltranslator.patternhandling; * @version 1.0 25/10/2023 */ +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + import tmltranslator.*; @@ -77,5 +81,47 @@ public class MappingPatternTask { return (taskToMapName + MAP_TASK_IN_NEW_HW_SEPARATOR + busNameForNewHw); } } + + public static List<MappingPatternTask> getTasksToMap(LinkedHashMap<String, TaskPattern> _allPatternTasks, List<String> _cloneTasks) { + List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>(); + for (String taskPattern : _allPatternTasks.keySet()) { + MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN); + tasksToMap.add(taskToMap); + } + for (String taskClone : _cloneTasks) { + MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE); + tasksToMap.add(taskToMap); + } + return tasksToMap; + } + + public static List<MappingPatternTask> getTasksLeftToMap(List<MappingPatternTask> _mappedTasks, List<MappingPatternTask> _allTasksToMap) { + List<MappingPatternTask> tasksLeftToMap = new ArrayList<MappingPatternTask>(); + for (MappingPatternTask taskToMap : _allTasksToMap) { + boolean isLeftToMap = true; + for (MappingPatternTask mappedTask : _mappedTasks) { + if (taskToMap.getTaskToMapName().equals(mappedTask.getTaskToMapName())) { + isLeftToMap = false; + break; + } + } + if (isLeftToMap) { + tasksLeftToMap.add(taskToMap); + } + } + return tasksLeftToMap; + } + // public static List<String> getListTasksToMapWith(List<MappingPatternTask> _mappedTasks, List<String> _cloneTasks) { + // List<MappingPatternTask> tasksToMap = new ArrayList<MappingPatternTask>(); + // for (String taskPattern : _allPatternTasks.keySet()) { + // MappingPatternTask taskToMap = new MappingPatternTask(taskPattern, ORIGIN_PATTERN); + // tasksToMap.add(taskToMap); + // } + // for (String taskClone : _cloneTasks) { + // MappingPatternTask taskToMap = new MappingPatternTask(taskClone, ORIGIN_CLONE); + // tasksToMap.add(taskToMap); + // } + // return tasksToMap; + // } } diff --git a/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java index 512d7bf6d39c5533078601bb2ae32dcc42450f21..eeb71a0e602b8fc1aad1115bee056890dadcae48 100644 --- a/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java +++ b/src/main/java/tmltranslator/patternhandling/PatternConfiguration.java @@ -51,6 +51,14 @@ public class PatternConfiguration { return clonedTasks; } + public List<String> getClonedTasksName() { + List<String> cloneTasksName = new ArrayList<String>(); + for (PatternCloneTask clonedTask : clonedTasks) { + cloneTasksName.add(clonedTask.getClonedTask()); + } + return cloneTasksName; + } + public List<PatternPortsConfig> getPortsConfig() { return portsConfig; } diff --git a/src/main/java/tmltranslator/patternhandling/PatternIntegration.java b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java index 736fc44d73ffcb07b7c152f5b670a9145e7c0064..7a8101ff9ca1d4915055ccfcf7c426f0e292885b 100644 --- a/src/main/java/tmltranslator/patternhandling/PatternIntegration.java +++ b/src/main/java/tmltranslator/patternhandling/PatternIntegration.java @@ -1790,6 +1790,7 @@ public class PatternIntegration implements Runnable { HwLink linkNewMemWithBus = new HwLink("link_" + _newMem.getName() + "_to_" + bus.getName()); linkNewMemWithBus.bus = bus; linkNewMemWithBus.hwnode = _newMem; + _tmapModel.addCommToHwCommNode(chToMap, bus); _tmapModel.getArch().addHwLink(linkNewMemWithBus); } } diff --git a/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java index ccea9e5d7e20edc9590c51854473bcd4829de6e0..7e8909dc1d18f854260dfe5b099f696c77a3c2f5 100644 --- a/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java +++ b/src/main/java/tmltranslator/patternhandling/PatternPortsConfig.java @@ -161,4 +161,89 @@ public class PatternPortsConfig { return portsToConf; } + + public static List<PatternPortsConfig> getPortsLeftToConfig(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, LinkedHashMap<String, TaskPorts> _portsTaskOfModelLeft, List<String> _clonedTasks, List<PatternPortsConfig> _configuredPorts, TMLModeling<?> tmlmodel) { + List<PatternPortsConfig> portsLeftToConf = new ArrayList<PatternPortsConfig>(); + List<PatternPortsConfig> portsToConfig = PatternPortsConfig.getPortsToConfig(_portsTaskOfModelAll, _portsTaskOfModelLeft, _clonedTasks, tmlmodel); + for (PatternPortsConfig portToConfig : portsToConfig) { + boolean isToConfig = true; + for (PatternPortsConfig portConfigured : _configuredPorts) { + if (portToConfig.getTaskOfChannelToConfig().equals(portConfigured.getTaskOfChannelToConfig()) && portToConfig.getChannelToConfig().equals(portConfigured.getChannelToConfig())) { + isToConfig = false; + break; + } + } + if (isToConfig) { + portsLeftToConf.add(portToConfig); + } + } + return portsLeftToConf; + } + + public static List<String> getPortsCanBeMergedWith(LinkedHashMap<String, TaskPorts> _portsTaskOfModelAll, List<PatternPortsConfig> _allPortsToConfig, String _taskOfPortToConfig) { + List<String> portsCanBeMergedWith = new ArrayList<String>(); + if (_portsTaskOfModelAll.containsKey(_taskOfPortToConfig)) { + for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(wr); + } + } + for (String wr : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWriteChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(wr)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(wr); + } + } + for (String rd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getReadChannels()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(rd)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(rd); + } + } + for (String sd : _portsTaskOfModelAll.get(_taskOfPortToConfig).getSendEvents()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(sd)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(sd); + } + } + for (String we : _portsTaskOfModelAll.get(_taskOfPortToConfig).getWaitEvents()) { + boolean canBeMergedWith = true; + for (PatternPortsConfig portToConfig : _allPortsToConfig) { + if (portToConfig.getTaskOfChannelToConfig().equals(_taskOfPortToConfig) && portToConfig.getChannelToConfig().equals(we)) { + canBeMergedWith = false; + break; + } + } + if (canBeMergedWith) { + portsCanBeMergedWith.add(we); + } + } + } + return portsCanBeMergedWith; + } } diff --git a/src/main/java/tmltranslator/patternhandling/TaskPattern.java b/src/main/java/tmltranslator/patternhandling/TaskPattern.java index 9ac212a7341f4d8a6c16fa1c5393f1b556835b11..1912b1322fec9a7d942195ac49aa08ce730ed977 100644 --- a/src/main/java/tmltranslator/patternhandling/TaskPattern.java +++ b/src/main/java/tmltranslator/patternhandling/TaskPattern.java @@ -44,6 +44,7 @@ public class TaskPattern { } public static LinkedHashMap<String, TaskPattern> parsePatternJsonFile(String pathPatternFoler, String fileName) { + TraceManager.addDev("path=" + pathPatternFoler+"/"+fileName); Path jsonFilePath = Path.of(pathPatternFoler+"/"+fileName); String jsonFilecontent = ""; LinkedHashMap<String, TaskPattern> tasksPattern = new LinkedHashMap<String, TaskPattern>(); @@ -119,11 +120,16 @@ public class TaskPattern { public static LinkedHashMap<String, TaskPattern> getPatternTasksLeft(LinkedHashMap<String, TaskPattern> _patternTasksAll, List<PatternConnection> patternConnections) { LinkedHashMap<String, TaskPattern> patternTasksLeft = new LinkedHashMap<String, TaskPattern>(_patternTasksAll); + for (String taskPattern: _patternTasksAll.keySet()) { + if (_patternTasksAll.get(taskPattern).getExternalPorts().size() == 0) { + patternTasksLeft.remove(taskPattern); + } + } for (PatternConnection patternConnection: patternConnections) { if (patternTasksLeft.containsKey(patternConnection.getPatternTaskName())) { - patternTasksLeft.get(patternConnection.getModelTaskName()).removeExternalPort(patternConnection.getPatternChannel()); - if (patternTasksLeft.get(patternConnection.getModelTaskName()).getExternalPorts().size() == 0) { - patternTasksLeft.remove(patternConnection.getModelTaskName()); + patternTasksLeft.get(patternConnection.getPatternTaskName()).removeExternalPort(patternConnection.getPatternChannel()); + if (patternTasksLeft.get(patternConnection.getPatternTaskName()).getExternalPorts().size() == 0) { + patternTasksLeft.remove(patternConnection.getPatternTaskName()); } } }