diff --git a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java index cb99bb9666c1da906f520f12ca465ca3890a7fac..239fdb87523264210b57cd05092609ba3388ba61 100644 --- a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java +++ b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java @@ -19,7 +19,6 @@ public class OptimizationModel { private InputInstance inputInstance; public OptimizationModel(InputInstance inputInstance) { - this.inputInstance = inputInstance; } @@ -39,6 +38,41 @@ public class OptimizationModel { this.optimizedSolutionStart = optimizedSolutionStart; } + public Context findOptimizedMapping() { + Context ctx; + try { + + // These examples need model generation turned on. + HashMap<String, String> cfg = new HashMap<String, String>(); + cfg.put("model", "true"); + ctx = new Context(cfg); + + + findOptimizedMapping(ctx); + + Log.close(); + if (Log.isOpen()) + TraceManager.addDev("Log is still open!"); + } catch (Z3Exception ex) { + TraceManager.addDev("Z3 Managed Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace( + System.out); + return null; + } catch (OptimizationModel.TestFailedException ex) { + TraceManager.addDev("TEST CASE FAILED: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + return null; + } catch (Exception ex) { + TraceManager.addDev("Unknown Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + return null; + } + return ctx; + } + public void findFeasibleMapping(Context ctx) throws TestFailedException { diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index ba3596388ca1c62fefb5daca91b2a47512903937..9c401caa7d3f1a3475c263e34344f0b564502566 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -49,6 +49,7 @@ import launcher.RemoteExecutionThread; import launcher.RshClient; import myutil.*; import proverifspec.ProVerifOutputAnalyzer; +import tmltranslator.TMLMapping; import translator.CheckingError; import translator.MasterGateManager; import ui.ad.TActivityDiagramPanel; @@ -4788,7 +4789,7 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per } public void dse() { - TraceManager.addDev("Design space exploration"); + //TraceManager.addDev("Design space exploration"); JDialogDSE jdse = new JDialogDSE(frame, this, "Design Space Exploration", SpecConfigTTool.SystemCCodeDirectory, SpecConfigTTool.TMLCodeDirectory); // jdse.setSize(600,800); GraphicLib.centerOnParent(jdse, 700, 800); @@ -4797,12 +4798,22 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per } public void dseZ3() { - TraceManager.addDev("Design space exploration with Z3"); - /*JDialogDSE jdse = new JDialogDSE(frame, this, "Design Space Exploration", SpecConfigTTool.SystemCCodeDirectory, SpecConfigTTool.TMLCodeDirectory); - // jdse.setSize(600,800); - GraphicLib.centerOnParent(jdse, 700, 800); - jdse.setVisible(true); - dtree.toBeUpdated();*/ + //TraceManager.addDev("Design space exploration with Z3"); + if (gtm == null) { + return; + } + + TMLMapping map = gtm.getTMLMapping(); + + if (map == null) { + return; + } + + JDialogDSEZ3 jdsez3 = new JDialogDSEZ3(frame, this, "Design Space Exploration with Z3", map, SpecConfigTTool.TMLCodeDirectory); + // jdsez3.setSize(600,800); + GraphicLib.centerOnParent(jdsez3, 700, 800); + jdsez3.setVisible(true); + dtree.toBeUpdated(); } public void avatarStaticAnalysis() { diff --git a/ttool/src/test/java/tmltranslator/dsez3engine/InputInstanceTest.java b/ttool/src/test/java/tmltranslator/dsez3engine/InputInstanceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..89bfd2a0e55a36de72fe954cf7c36c1a41aeb251 --- /dev/null +++ b/ttool/src/test/java/tmltranslator/dsez3engine/InputInstanceTest.java @@ -0,0 +1,379 @@ +package tmltranslator.dsez3engine; + +import com.microsoft.z3.*; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import tmltranslator.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import myutil.TraceManager; + +import static org.junit.Assert.*; + +public class InputInstanceTest { + + private TMLArchitecture tmla; + private TMLModeling tmlm; + private InputInstance inputInstance; + private OptimizationModel optimizationModel; + + @Before + public void setUpTest() { + + tmla = setUpTMLArchitecture(); + tmlm = setUpTMLModeling(); + + inputInstance = new InputInstance(tmla, tmlm); + optimizationModel = new OptimizationModel(inputInstance); + } + + private TMLModeling setUpTMLModeling() { + + tmlm = new TMLModeling(); + + + TMLTask taskA = new TMLTask("task__A", null, null); + TMLTask taskB = new TMLTask("task__B", null, null); + TMLTask taskD = new TMLTask("task__D", null, null); + TMLTask taskE = new TMLTask("task__E", null, null); + + //filling activity diagrams of tasks + + //taskA + TMLActivityElementWithAction firstA = new TMLExecI("execiA", null); + firstA.setAction("150"); + taskA.getActivityDiagram().setFirst(firstA); + + TMLActivityElement AwB = new TMLWriteChannel("AwB", null); + taskA.getActivityDiagram().addLinkElement(firstA, AwB); + taskA.getActivityDiagram().addElement(AwB); + + TMLActivityElement AwD = new TMLWriteChannel("AwD", null); + taskA.getActivityDiagram().addLinkElement(AwB, AwD); + taskA.getActivityDiagram().addElement(AwD); + + //taskB + TMLActivityElement firstB = new TMLReadChannel("BrA", null); + taskB.getActivityDiagram().setFirst(firstB); + + TMLActivityElementWithAction execiB = new TMLExecI("execiB", null); + execiB.setAction("100"); + taskB.getActivityDiagram().addLinkElement(firstB, execiB); + taskB.getActivityDiagram().addElement(execiB); + + TMLActivityElement BwE = new TMLWriteChannel("BwE", null); + taskB.getActivityDiagram().addLinkElement(execiB, BwE); + taskB.getActivityDiagram().addElement(BwE); + + //taskD + TMLActivityElement firstD = new TMLReadChannel("DrA", null); + taskD.getActivityDiagram().setFirst(firstD); + + TMLActivityElementWithAction execiD = new TMLExecI("execiD", null); + execiD.setAction("100"); + taskD.getActivityDiagram().addLinkElement(firstD, execiD); + taskD.getActivityDiagram().addElement(execiD); + + TMLActivityElement DwE = new TMLWriteChannel("DwE", null); + taskD.getActivityDiagram().addLinkElement(execiD, DwE); + taskD.getActivityDiagram().addElement(DwE); + + //taskE + TMLActivityElement firstE = new TMLReadChannel("ErB", null); + taskE.getActivityDiagram().setFirst(firstE); + + TMLActivityElement ErD = new TMLReadChannel("ErD", null); + taskE.getActivityDiagram().addLinkElement(firstE, ErD); + taskE.getActivityDiagram().addElement(ErD); + + TMLActivityElementWithAction execiE = new TMLExecI("execiE", null); + execiE.setAction("50"); + taskE.getActivityDiagram().addLinkElement(ErD, execiE); + taskE.getActivityDiagram().addElement(execiE); + + + taskA.addOperation("generic"); + taskB.addOperation("fft"); + taskD.addOperation("fft"); + taskE.addOperation("generic"); + + //creating channels + TMLChannel ab = new TMLChannel("ab", null); + TMLChannel ad = new TMLChannel("ad", null); + TMLChannel be = new TMLChannel("be", null); + TMLChannel de = new TMLChannel("de", null); + + taskA.addWriteTMLChannel(ab); + taskA.addWriteTMLChannel(ad); + + taskB.addReadTMLChannel(ab); + taskB.addWriteTMLChannel(be); + + taskD.addReadTMLChannel(ad); + taskD.addWriteTMLChannel(de); + + taskE.addReadTMLChannel(be); + taskE.addReadTMLChannel(de); + + ab.setTasks(taskA, taskB); + ad.setTasks(taskA, taskD); + be.setTasks(taskB, taskE); + de.setTasks(taskD, taskE); + + ab.setNumberOfSamples(2); + ad.setNumberOfSamples(2); + be.setNumberOfSamples(5); + de.setNumberOfSamples(5); + + tmlm.addTask(taskA); + tmlm.addTask(taskB); + tmlm.addTask(taskD); + tmlm.addTask(taskE); + + tmlm.addChannel(ab); + tmlm.addChannel(ad); + tmlm.addChannel(be); + tmlm.addChannel(de); + + + return tmlm; + } + + + private TMLArchitecture setUpTMLArchitecture() { + + HwExecutionNode mainCPU = new HwCPU("MainCPU"); + HwMemory mainMem = new HwMemory("mainMem"); + + HwExecutionNode dsp = new HwCPU("dsp"); + HwMemory dspMem = new HwMemory("dspMem"); + + HwBus bus0 = new HwBus("bus0"); + HwBus bus1 = new HwBus("bus1"); + + + HwLink maincpu_bus0 = new HwLink("maincpu_bus0"); + HwLink bus0_cpumem = new HwLink("bus0_cpumem"); + + HwLink dsp_bus1 = new HwLink("dsp_bus1"); + HwLink bus1_dspmem = new HwLink("bus1_dspmem"); + + mainCPU.execiTime = 2; + dsp.execiTime = 1; + + + mainCPU.addOperationType("generic"); + mainCPU.addOperationType("fft"); + + mainMem.memorySize = 200; + + dsp.addOperationType("fft"); + dspMem.memorySize = 100; + + maincpu_bus0.hwnode = mainCPU; + maincpu_bus0.bus = bus0; + + bus0_cpumem.bus = bus0; + bus0_cpumem.hwnode = mainMem; + + dsp_bus1.hwnode = dsp; + dsp_bus1.bus = bus1; + + bus1_dspmem.bus = bus1; + bus1_dspmem.hwnode = dspMem; + + + tmla = new TMLArchitecture(); + + tmla.addHwNode(mainCPU); + tmla.addHwNode(dsp); + tmla.addHwNode(mainMem); + tmla.addHwNode(dspMem); + tmla.addHwNode(bus0); + tmla.addHwNode(bus1); + tmla.addHwLink(maincpu_bus0); + tmla.addHwLink(bus0_cpumem); + tmla.addHwLink(dsp_bus1); + tmla.addHwLink(bus1_dspmem); + + return tmla; + } + + @Test + public void findOptimizedMapping() { + + try { + + // These examples need model generation turned on. + HashMap<String, String> cfg = new HashMap<String, String>(); + cfg.put("model", "true"); + Context ctx = new Context(cfg); + + + optimizationModel.findOptimizedMapping(ctx); + + Log.close(); + if (Log.isOpen()) + TraceManager.addDev("Log is still open!"); + } catch (Z3Exception ex) { + TraceManager.addDev("Z3 Managed Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace( + System.out); + } catch (OptimizationModel.TestFailedException ex) { + TraceManager.addDev("TEST CASE FAILED: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + } catch (Exception ex) { + TraceManager.addDev("Unknown Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + } + + assertEquals(1, optimizationModel.getOptimizedSolutionX().get("X[task__A][MainCPU] = ").intValue()); + assertEquals(0, optimizationModel.getOptimizedSolutionX().get("X[task__A][dsp] = ").intValue()); + assertEquals(0, optimizationModel.getOptimizedSolutionX().get("X[task__B][MainCPU] = ").intValue()); + assertEquals(1, optimizationModel.getOptimizedSolutionX().get("X[task__B][dsp] = ").intValue()); + assertEquals(0, optimizationModel.getOptimizedSolutionX().get("X[task__D][MainCPU] = ").intValue()); + assertEquals(1, optimizationModel.getOptimizedSolutionX().get("X[task__D][dsp] = ").intValue()); + assertEquals(1, optimizationModel.getOptimizedSolutionX().get("X[task__E][MainCPU] = ").intValue()); + assertEquals(0, optimizationModel.getOptimizedSolutionX().get("X[task__E][dsp] = ").intValue()); + + assertEquals(0, optimizationModel.getOptimizedSolutionStart().get("start[task__A] = ").intValue()); + assertEquals(300, optimizationModel.getOptimizedSolutionStart().get("start[task__B] = ").intValue()); + assertEquals(400, optimizationModel.getOptimizedSolutionStart().get("start[task__D] = ").intValue()); + assertEquals(500, optimizationModel.getOptimizedSolutionStart().get("start[task__E] = ").intValue()); + + } + + + @Test + public void findFeasibleMapping() { + + try { + + // These examples need model generation turned on. + HashMap<String, String> cfg = new HashMap<String, String>(); + cfg.put("model", "true"); + Context ctx = new Context(cfg); + + + optimizationModel.findFeasibleMapping(ctx); + + Log.close(); + if (Log.isOpen()) + TraceManager.addDev("Log is still open!"); + } catch (Z3Exception ex) { + TraceManager.addDev("Z3 Managed Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace( + System.out); + } catch (OptimizationModel.TestFailedException ex) { + TraceManager.addDev("TEST CASE FAILED: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + } catch (Exception ex) { + TraceManager.addDev("Unknown Exception: " + ex.getMessage()); + TraceManager.addDev("Stack trace: "); + ex.printStackTrace(System.out); + } + + + } + + + @Test + public void getFeasibleCPUs() { + + Boolean test = false; + List <HwExecutionNode> expectedList = new ArrayList<>(); + expectedList.add(inputInstance.getArchitecture().getHwCPUByName("MainCPU")); + expectedList.add(inputInstance.getArchitecture().getHwCPUByName("dsp")); + + TMLTask tempTask = (TMLTask) inputInstance.getModeling().getTasks().get(2); + + + List<HwExecutionNode> actualList = new ArrayList<>(); + + for (int i = 0; i < inputInstance.getFeasibleCPUs(tempTask).size(); i++) { + actualList.add(inputInstance.getFeasibleCPUs(tempTask).get(i)); + } + + assertEquals(actualList.size(), expectedList.size()); + + for (HwExecutionNode hwExecutionNode : actualList){ + assertTrue(expectedList.contains(hwExecutionNode)); + } + + } + + @Test + public void getBufferIn() { + + List<TMLTask> tempTasks = new ArrayList<>(); + for (int i = 0; i < inputInstance.getModeling().getTasks().size(); i++) { + tempTasks.add((TMLTask) inputInstance.getModeling().getTasks().get(i)); + } + + assertEquals(inputInstance.getBufferIn( tempTasks.get(0)), 0); + assertEquals(inputInstance.getBufferIn( tempTasks.get(1)), 2); + assertEquals(inputInstance.getBufferIn( tempTasks.get(2)), 2); + assertEquals(inputInstance.getBufferIn(tempTasks.get(3)), 10); + + + } + + @Test + public void getBufferOut() { + List<TMLTask> tempTasks = new ArrayList<>(); + for (int i = 0; i < inputInstance.getModeling().getTasks().size(); i++) { + tempTasks.add((TMLTask) inputInstance.getModeling().getTasks().get(i)); + } + + assertEquals(inputInstance.getBufferOut( tempTasks.get(0)), 4); + assertEquals(inputInstance.getBufferOut( tempTasks.get(1)), 5); + assertEquals(inputInstance.getBufferOut( tempTasks.get(2)), 5); + assertEquals(inputInstance.getBufferOut( tempTasks.get(3)), 0); + + } + + + @Test + public void getLocalMemoryOfHwExecutionNode() { + + HwNode output1 = inputInstance.getArchitecture().getHwMemoryByName("mainMem"); + HwNode output2 = inputInstance.getArchitecture().getHwMemoryByName("dspMem"); + + assertTrue("comparing between the expected local memory for main_CPU and the memory found", inputInstance.getLocalMemoryOfHwExecutionNode(inputInstance.getArchitecture().getHwNodeByName("MainCPU")) == output1); + assertTrue("comparing between the expected local memory for DSP and the memory found", inputInstance.getLocalMemoryOfHwExecutionNode(inputInstance.getArchitecture().getHwNodeByName("dsp")) == output2); + + } + + + @Test + public void getWCET() { + //a temporary list of the tasks + List<TMLTask> tempTasks = new ArrayList<>(); + for (int i = 0; i < inputInstance.getModeling().getTasks().size(); i++) { + tempTasks.add((TMLTask) inputInstance.getModeling().getTasks().get(i)); + } + int expectedWcetA_CPU = 300; + int expectedWcetA_dsp = 150; + + assertEquals("comparing between the expected WCET of task A on main_CPU and the computed value", expectedWcetA_CPU, inputInstance.getWCET(tempTasks.get(0), (HwExecutionNode) inputInstance.getArchitecture().getHwNodeByName("MainCPU"))); + assertEquals("comparing between the expected WCET of task A on DSP and the computed value", expectedWcetA_dsp, inputInstance.getWCET(tempTasks.get(0), (HwExecutionNode) inputInstance.getArchitecture().getHwNodeByName("dsp"))); + + } + + + @Test + public void getFinalTask() { + assertEquals("checking the last task", inputInstance.getModeling().getTMLTaskByName("task__E"), inputInstance.getFinalTask(inputInstance.getModeling())); + + } +} + +