From f64aa582a73caec3ddb8f5be67db7f79a53307dd Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Feb 2019 21:20:46 +0100 Subject: [PATCH 001/145] GUI working with mvn --- .../java/com/dat3m/dartagnan/Dartagnan.java | 2 +- dat3m.ui/.gitignore | 1 + dat3m.ui/pom.xml | 68 +++ .../src/main/java/com/dat3m/ui/Dat3m.java | 462 ++++++++++++++++++ pom.xml | 1 + 5 files changed, 533 insertions(+), 1 deletion(-) create mode 100644 dat3m.ui/.gitignore create mode 100644 dat3m.ui/pom.xml create mode 100644 dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index 8210e2db78..b73dd01488 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -126,7 +126,7 @@ public static void main(String[] args) throws IOException { } } - static boolean testProgram(Solver solver, Context ctx, Program program, Wmm wmm, Arch target, int steps, + public static boolean testProgram(Solver solver, Context ctx, Program program, Wmm wmm, Arch target, int steps, Mode mode, Alias alias){ program.unroll(steps); diff --git a/dat3m.ui/.gitignore b/dat3m.ui/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/dat3m.ui/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/dat3m.ui/pom.xml b/dat3m.ui/pom.xml new file mode 100644 index 0000000000..bebe1ee6e0 --- /dev/null +++ b/dat3m.ui/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.dat3m + dat3m + 2.0 + + + dat3m.ui + dat3m.ui + jar + + + + com.dat3m.dartagnan + dartagnan + 2.0 + + + com.microsoft + z3 + 4.3.2 + + + com.google.guava + guava + 27.0.1-jre + + + org.antlr + antlr4-runtime + 4.7.2 + + + commons-cli + commons-cli + 1.4 + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + + com.dat3m.ui.Dat3m + + + + jar-with-dependencies + + + + + + + + diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java new file mode 100644 index 0000000000..696941e03a --- /dev/null +++ b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java @@ -0,0 +1,462 @@ +package com.dat3m.ui; + +import static com.dat3m.dartagnan.Dartagnan.parseProgram; +import static com.dat3m.dartagnan.program.utils.Alias.CFIS; +import static com.dat3m.dartagnan.program.utils.Alias.CFS; +import static com.dat3m.dartagnan.wmm.utils.Arch.ARM; +import static com.dat3m.dartagnan.wmm.utils.Arch.ARM8; +import static com.dat3m.dartagnan.wmm.utils.Arch.POWER; +import static com.dat3m.dartagnan.wmm.utils.Arch.TSO; +import static com.dat3m.dartagnan.wmm.utils.Mode.IDL; +import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; +import static com.dat3m.ui.Dat3m.Editable.MM; +import static com.dat3m.ui.Dat3m.Editable.PROGRAM; +import static com.dat3m.ui.Dat3m.Task.PORTABILITY; +import static com.dat3m.ui.Dat3m.Task.REACHABILITY; +import static java.awt.BorderLayout.CENTER; +import static java.awt.Color.BLACK; +import static java.awt.Color.WHITE; +import static java.awt.FlowLayout.LEFT; +import static java.awt.Font.ITALIC; +import static java.awt.Image.SCALE_DEFAULT; +import static java.lang.Integer.parseInt; +import static java.lang.System.getProperty; +import static java.util.stream.Collectors.joining; +import static javax.swing.JFileChooser.APPROVE_OPTION; +import static javax.swing.JFrame.EXIT_ON_CLOSE; +import static javax.swing.JOptionPane.INFORMATION_MESSAGE; +import static javax.swing.JOptionPane.showMessageDialog; +import static javax.swing.border.TitledBorder.TOP; + +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JEditorPane; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; +import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; + +import com.microsoft.z3.Context; +import com.microsoft.z3.Solver; + +import com.dat3m.dartagnan.parsers.cat.ParserCat; +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.program.utils.Alias; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.dartagnan.wmm.utils.Mode; + +public class Dat3m { + + enum Editable { PROGRAM, MM; } + enum Task { REACHABILITY, PORTABILITY; } + + private static final String PROGRAMLABEL = "Program"; + private static final String MMLABEL = "Memory Model"; + + private static final int OPTIONSWIDTH = 400; + private static final int ICONWIDTH = 400; + private static final int ICONHEIGHT = 550; + + private static final String TMPPROGPATH = "./.tmp/program"; + private static final String TMPMMPATH = "./.tmp/mm.cat"; + + public static final String TACTIC = "qfufbv"; + + private static String loadedFormat = ".pts"; + + ImageIcon dat3mIcon = new ImageIcon(getProperty("user.dir") + "/../icon/dat3m.jpg"); + ImageIcon dartagnanIcon = new ImageIcon(getProperty("user.dir") + "/icon/dartagnan.jpg"); + ImageIcon porthosIcon = new ImageIcon(getProperty("user.dir") + "/../porthos/icon/porthos.jpg"); + + private JFrame frame = new JFrame(); + private JMenu importMenu = new JMenu("Import"); + + private JEditorPane programEditor = new JTextPane(); + private JEditorPane mmEditor = new JTextPane(); + private JEditorPane console = new JTextPane(); + private JEditorPane unrollingEditor = new JTextPane(); + + Task[] tasks = { REACHABILITY, PORTABILITY }; + private JComboBox taskSelector = new JComboBox(tasks); + + Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; + private JComboBox archSelector = new JComboBox(archs); + + Mode[] modes = { KNASTER, IDL, Mode.KLEENE }; + private JComboBox modeSelector = new JComboBox(modes); + + Alias[] aliases = { Alias.NONE, CFIS, CFS }; + private JComboBox aliasSelector = new JComboBox(aliases); + + private JLabel icon = new JLabel(); + + private Task task; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + Dat3m window = new Dat3m(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public Dat3m() { + createFrame(); + createImportMenu(); + createProgramImporter(); + createMMImporter(); + createUnrollingEditor(); + createConsole(); + + JPanel panel = new JPanel(new GridLayout(1,2)); + panel.add(createEditor(programEditor, PROGRAMLABEL)); + panel.add(createEditor(mmEditor, MMLABEL)); + panel.add(createOptionsPane()); + + frame.getContentPane().add(panel, CENTER); + } + + private ImageIcon reSizeIcon(ImageIcon icon, int widht, int heigh) { + Image image = icon.getImage().getScaledInstance(widht, heigh, SCALE_DEFAULT); + return new ImageIcon(image); + } + + /** + * Initialize the contents of the frame. + */ + private void createFrame() { + Dimension DimMax = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setMaximumSize(DimMax); + frame.setExtendedState(JFrame.MAXIMIZED_BOTH); + frame.setDefaultCloseOperation(EXIT_ON_CLOSE); + Image image = dat3mIcon.getImage(); + frame.setIconImage(image); + } + + /** + * Initialize the contents of the importer menu. + */ + private void createImportMenu() { + JMenuBar menuBar = new JMenuBar(); + frame.setJMenuBar(menuBar); + menuBar.add(importMenu); + } + + /** + * Initialize the program importer from the menu. + */ + private void createProgramImporter() { + List programExtensions = new ArrayList(); + programExtensions.add("litmus"); + programExtensions.add("pts"); + createImporter(programEditor, programExtensions, PROGRAM); + } + + /** + * Initialize the memory model importer from the menu. + */ + private void createMMImporter() { + List mmExtensions = new ArrayList(); + mmExtensions.add("cat"); + createImporter(mmEditor, mmExtensions, MM); + } + + /** + * Create the editor for the unrolling bound. + */ + private JPanel createUnrollingEditor() { + unrollingEditor.setText("1"); + JPanel usPane = new JPanel(new FlowLayout(LEFT)); + usPane.setBackground(BLACK); + JLabel usLabel = new JLabel("Unrolling Bound:"); + usLabel.setForeground(WHITE); + usLabel.setFont(new Font("Serif", ITALIC, 20)); + usPane.add(usLabel); + usPane.add(unrollingEditor); + usPane.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); + return usPane; + } + + /** + * Create the output console. + */ + private void createConsole() { + TitledBorder consoleBorder = new TitledBorder("Console"); + consoleBorder.setTitleJustification(TitledBorder.CENTER); + consoleBorder.setTitlePosition(TOP); + console.setEditable(false); + console.setBorder(consoleBorder); + console.setPreferredSize(new Dimension(OPTIONSWIDTH, 150)); + } + + /** + * Create a generic selector. + */ + private JPanel createSelector(JComboBox cb, String label) { + JPanel pane = new JPanel(new FlowLayout(LEFT)); + pane.setBackground(BLACK); + JLabel plabel = new JLabel(label); + plabel.setForeground(WHITE); + plabel.setFont(new Font("Serif", ITALIC, 20)); + pane.add(plabel); + pane.add(cb); + pane.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); + return pane; + } + + /** + * Create the option panel for tool parameters. + */ + private JPanel createOptionsPane() { + taskSelector.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + Object item = taskSelector.getSelectedItem(); + if (REACHABILITY.equals(item)) { + task = REACHABILITY; + } else if (PORTABILITY.equals(item)) { + task = PORTABILITY; + } + updateIcon(); + } + }); + + JPanel pane = new JPanel(); + pane.setBackground(BLACK); + // Default image + reSizeIcon(dartagnanIcon, ICONWIDTH, ICONHEIGHT); + icon.setIcon(dartagnanIcon); + pane.add(icon); + task = (Task) taskSelector.getSelectedItem(); + + taskSelector.setPreferredSize(new Dimension(336, 30)); + archSelector.setPreferredSize(new Dimension(194, 30)); + modeSelector.setPreferredSize(new Dimension(326, 30)); + aliasSelector.setPreferredSize(new Dimension(247, 30)); + + pane.add(createSelector(taskSelector, "Task:")); + pane.add(createSelector(archSelector, "Compiler Mapping:")); + pane.add(createSelector(modeSelector, "Mode:")); + pane.add(createSelector(aliasSelector, "Alias Analysis:")); + pane.add(createUnrollingEditor()); + pane.add(createTestButton()); + pane.add(console); + pane.add(createClearButton()); + + return pane; + } + + private JButton createTestButton() { + JButton testButton = new JButton("Test"); + testButton.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); + testButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(programEditor.getText().isEmpty()) { + showMessageDialog(frame, "No program has been imported.", "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); + return; + } + if(mmEditor.getText().isEmpty()) { + showMessageDialog(frame, "No memory model has been imported.", "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); + return; + } + + Arch target = (Arch) archSelector.getSelectedItem(); + Mode mode = (Mode) modeSelector.getSelectedItem(); + Alias alias = (Alias) aliasSelector.getSelectedItem(); + int bound = parseInt(unrollingEditor.getText()); + + try { + Context ctx = new Context(); + Solver s = ctx.mkSolver(ctx.mkTactic(TACTIC)); + String result = testProgramFromEditors(s, ctx, programEditor, mmEditor, target, mode, alias, bound); + console.setText(result); + } catch (Exception exp) { + showMessageDialog(frame, exp.getMessage(), "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); + return; + } + } + }); + return testButton; + } + + private JButton createClearButton() { + JButton clearButton = new JButton("Clear Console"); + clearButton.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); + clearButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + console.setText(""); + } + }); + return clearButton; + } + + /** + * Update the displayed image. This method will be called when the task is selected. + */ + private void updateIcon() { + ImageIcon imageIcon = null; + switch (task) { + case REACHABILITY: + imageIcon = dartagnanIcon; + break; + case PORTABILITY: + imageIcon = porthosIcon; + break; + default: + break; + } + Image image = imageIcon.getImage().getScaledInstance(ICONWIDTH, ICONHEIGHT, java.awt.Image.SCALE_DEFAULT); + imageIcon = new ImageIcon(image); + icon.setIcon(imageIcon); + } + + /** + * Create a generic importer. + */ + private void createImporter(JEditorPane editor, List extensions, Editable type) { + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + String name = ""; + switch (type) { + case PROGRAM: + name = PROGRAMLABEL; + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.pts", "pts")); + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.litmus", "litmus")); + break; + case MM: + name = MMLABEL; + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.cat", "cat")); + break; + default: + break; + } + JMenuItem openItem = new JMenuItem(name); + importMenu.add(openItem); + openItem.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event){ + int r=chooser.showOpenDialog(null); + if(r==APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + String ext = path.substring(path.lastIndexOf('.') + 1).trim(); + if(type.equals(PROGRAM)) { + loadedFormat = "." + ext; + } + if(!extensions.contains(ext)) { + showMessageDialog(frame, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file!"); + return; + } + loadFileData(path, editor); + } + } + }); + } + + /** + * Create a generic editor with border and title. + */ + private JScrollPane createEditor(JEditorPane editor, String title) { + + TitledBorder border = new TitledBorder(title); + border.setTitleFont(new Font("Serif", ITALIC, 25)); + border.setTitleJustification(TitledBorder.CENTER); + border.setTitlePosition(TOP); + editor.setBorder(border); + return new JScrollPane(editor); + } + + /** + * Load the data of a file into a given editor. + */ + public void loadFileData(String path, JEditorPane editor) { + File file = new File(path); + Scanner fileScanner = null; + try { + fileScanner = new Scanner(file); + editor.setText(""); + + while(fileScanner.hasNextLine()) { + String line = fileScanner.nextLine(); + editor.setText(editor.getText() + line + "\n"); + } + + } catch(IOException fnfe) { + System.err.println(fnfe.getMessage()); + } + } + + public String testProgramFromEditors(Solver solver, Context ctx, JEditorPane pEditor, JEditorPane mmEditor, Arch target, Mode mode, Alias alias, int steps) { + try { + + File tmpProgramFile = new File(TMPPROGPATH + loadedFormat); + if (!tmpProgramFile.getParentFile().exists()) { + tmpProgramFile.getParentFile().mkdirs(); + } + if (!tmpProgramFile.exists()) { + tmpProgramFile.createNewFile(); + } + Writer writer = new PrintWriter(tmpProgramFile); + writer.write(pEditor.getText()); + writer.close(); + Program p = parseProgram(TMPPROGPATH + loadedFormat); + tmpProgramFile.delete(); + + File tmpMMFile = new File(TMPMMPATH); + if (!tmpMMFile.exists()) { + tmpMMFile.createNewFile(); + } + writer = new PrintWriter(tmpMMFile); + writer.write(mmEditor.getText()); + writer.close(); + Wmm mm = new ParserCat().parse(TMPMMPATH, target); + tmpMMFile.delete(); + + String result = "Condition " + p.getAss().toStringWithType() + "\n"; + result += com.dat3m.dartagnan.Dartagnan.testProgram(solver, ctx, p, mm, target, steps, mode, alias) ? "OK" : "No"; + return result; + + } catch (IOException e) { + return e.getMessage(); + } + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0a96e733d2..b7c424f0c1 100644 --- a/pom.xml +++ b/pom.xml @@ -84,5 +84,6 @@ dartagnan porthos + dat3m.ui \ No newline at end of file From 1e27a7ee7d0d3ee4c65946d4a2d841027e49ccdd Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Feb 2019 19:14:52 +0100 Subject: [PATCH 002/145] Updated to v2.0.1 --- dat3m.ui/pom.xml | 2 +- dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dat3m.ui/pom.xml b/dat3m.ui/pom.xml index bebe1ee6e0..0ae930a857 100644 --- a/dat3m.ui/pom.xml +++ b/dat3m.ui/pom.xml @@ -15,7 +15,7 @@ com.dat3m.dartagnan dartagnan - 2.0 + 2.0.1 com.microsoft diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java index 696941e03a..b2399c9796 100644 --- a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java +++ b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java @@ -1,6 +1,5 @@ package com.dat3m.ui; -import static com.dat3m.dartagnan.Dartagnan.parseProgram; import static com.dat3m.dartagnan.program.utils.Alias.CFIS; import static com.dat3m.dartagnan.program.utils.Alias.CFS; import static com.dat3m.dartagnan.wmm.utils.Arch.ARM; @@ -68,6 +67,7 @@ import com.microsoft.z3.Context; import com.microsoft.z3.Solver; +import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.parsers.cat.ParserCat; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.utils.Alias; @@ -437,8 +437,8 @@ public String testProgramFromEditors(Solver solver, Context ctx, JEditorPane pEd } Writer writer = new PrintWriter(tmpProgramFile); writer.write(pEditor.getText()); - writer.close(); - Program p = parseProgram(TMPPROGPATH + loadedFormat); + writer.close(); + Program p = new ProgramParser().parse(TMPPROGPATH + loadedFormat); tmpProgramFile.delete(); File tmpMMFile = new File(TMPMMPATH); From 8df0fdf4ddd2a56c4365f4e04990eaddee435d8e Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 24 Feb 2019 23:11:23 +0100 Subject: [PATCH 003/145] Cleaned UI plugin --- dat3m.ui/pom.xml | 51 +- .../src/main/java/com/dat3m/ui/Dat3m.java | 462 ------------------ .../src/main/java/org/dat3m/ui/Dat3M.java | 290 +++++++++++ dat3m.ui/src/main/java/org/dat3m/ui/Task.java | 18 + .../java/org/dat3m/ui/editor/EditorUtils.java | 48 ++ .../java/org/dat3m/ui/editor/IEditor.java | 12 + .../java/org/dat3m/ui/editor/MMEditor.java | 99 ++++ .../org/dat3m/ui/editor/ProgramEditor.java | 99 ++++ dat3m.ui/src/main/resources/dartagnan.jpg | Bin 0 -> 43451 bytes dat3m.ui/src/main/resources/dat3m.png | Bin 0 -> 31220 bytes dat3m.ui/src/main/resources/porthos.jpg | Bin 0 -> 57842 bytes 11 files changed, 592 insertions(+), 487 deletions(-) delete mode 100644 dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/Task.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java create mode 100644 dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java create mode 100644 dat3m.ui/src/main/resources/dartagnan.jpg create mode 100644 dat3m.ui/src/main/resources/dat3m.png create mode 100644 dat3m.ui/src/main/resources/porthos.jpg diff --git a/dat3m.ui/pom.xml b/dat3m.ui/pom.xml index 0ae930a857..6303a4fdb1 100644 --- a/dat3m.ui/pom.xml +++ b/dat3m.ui/pom.xml @@ -1,46 +1,46 @@ - - + + 4.0.0 com.dat3m dat3m - 2.0 + 2.0.1 + + com.dat3m.ui + ui + jar - dat3m.ui dat3m.ui - jar - - com.dat3m.dartagnan - dartagnan - 2.0.1 - com.microsoft z3 4.3.2 - com.google.guava - guava - 27.0.1-jre - - - org.antlr - antlr4-runtime - 4.7.2 - - - commons-cli - commons-cli - 1.4 + com.dat3m.dartagnan + dartagnan + 2.0.1 - + + + maven-surefire-plugin + + once + -Djava.library.path=${project.parent.basedir}/lib + + ${project.parent.basedir}/lib/ + ${project.parent.basedir}/lib/ + + + org.apache.maven.plugins maven-assembly-plugin @@ -53,7 +53,7 @@ - com.dat3m.ui.Dat3m + com.dat3m.ui.Dat3M @@ -65,4 +65,5 @@ + diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java deleted file mode 100644 index b2399c9796..0000000000 --- a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3m.java +++ /dev/null @@ -1,462 +0,0 @@ -package com.dat3m.ui; - -import static com.dat3m.dartagnan.program.utils.Alias.CFIS; -import static com.dat3m.dartagnan.program.utils.Alias.CFS; -import static com.dat3m.dartagnan.wmm.utils.Arch.ARM; -import static com.dat3m.dartagnan.wmm.utils.Arch.ARM8; -import static com.dat3m.dartagnan.wmm.utils.Arch.POWER; -import static com.dat3m.dartagnan.wmm.utils.Arch.TSO; -import static com.dat3m.dartagnan.wmm.utils.Mode.IDL; -import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; -import static com.dat3m.ui.Dat3m.Editable.MM; -import static com.dat3m.ui.Dat3m.Editable.PROGRAM; -import static com.dat3m.ui.Dat3m.Task.PORTABILITY; -import static com.dat3m.ui.Dat3m.Task.REACHABILITY; -import static java.awt.BorderLayout.CENTER; -import static java.awt.Color.BLACK; -import static java.awt.Color.WHITE; -import static java.awt.FlowLayout.LEFT; -import static java.awt.Font.ITALIC; -import static java.awt.Image.SCALE_DEFAULT; -import static java.lang.Integer.parseInt; -import static java.lang.System.getProperty; -import static java.util.stream.Collectors.joining; -import static javax.swing.JFileChooser.APPROVE_OPTION; -import static javax.swing.JFrame.EXIT_ON_CLOSE; -import static javax.swing.JOptionPane.INFORMATION_MESSAGE; -import static javax.swing.JOptionPane.showMessageDialog; -import static javax.swing.border.TitledBorder.TOP; - -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.Image; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.stream.Collectors; - -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JEditorPane; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; -import javax.swing.border.TitledBorder; -import javax.swing.filechooser.FileNameExtensionFilter; - -import com.microsoft.z3.Context; -import com.microsoft.z3.Solver; - -import com.dat3m.dartagnan.parsers.program.ProgramParser; -import com.dat3m.dartagnan.parsers.cat.ParserCat; -import com.dat3m.dartagnan.program.Program; -import com.dat3m.dartagnan.program.utils.Alias; -import com.dat3m.dartagnan.wmm.Wmm; -import com.dat3m.dartagnan.wmm.utils.Arch; -import com.dat3m.dartagnan.wmm.utils.Mode; - -public class Dat3m { - - enum Editable { PROGRAM, MM; } - enum Task { REACHABILITY, PORTABILITY; } - - private static final String PROGRAMLABEL = "Program"; - private static final String MMLABEL = "Memory Model"; - - private static final int OPTIONSWIDTH = 400; - private static final int ICONWIDTH = 400; - private static final int ICONHEIGHT = 550; - - private static final String TMPPROGPATH = "./.tmp/program"; - private static final String TMPMMPATH = "./.tmp/mm.cat"; - - public static final String TACTIC = "qfufbv"; - - private static String loadedFormat = ".pts"; - - ImageIcon dat3mIcon = new ImageIcon(getProperty("user.dir") + "/../icon/dat3m.jpg"); - ImageIcon dartagnanIcon = new ImageIcon(getProperty("user.dir") + "/icon/dartagnan.jpg"); - ImageIcon porthosIcon = new ImageIcon(getProperty("user.dir") + "/../porthos/icon/porthos.jpg"); - - private JFrame frame = new JFrame(); - private JMenu importMenu = new JMenu("Import"); - - private JEditorPane programEditor = new JTextPane(); - private JEditorPane mmEditor = new JTextPane(); - private JEditorPane console = new JTextPane(); - private JEditorPane unrollingEditor = new JTextPane(); - - Task[] tasks = { REACHABILITY, PORTABILITY }; - private JComboBox taskSelector = new JComboBox(tasks); - - Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; - private JComboBox archSelector = new JComboBox(archs); - - Mode[] modes = { KNASTER, IDL, Mode.KLEENE }; - private JComboBox modeSelector = new JComboBox(modes); - - Alias[] aliases = { Alias.NONE, CFIS, CFS }; - private JComboBox aliasSelector = new JComboBox(aliases); - - private JLabel icon = new JLabel(); - - private Task task; - - /** - * Launch the application. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - Dat3m window = new Dat3m(); - window.frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - /** - * Create the application. - */ - public Dat3m() { - createFrame(); - createImportMenu(); - createProgramImporter(); - createMMImporter(); - createUnrollingEditor(); - createConsole(); - - JPanel panel = new JPanel(new GridLayout(1,2)); - panel.add(createEditor(programEditor, PROGRAMLABEL)); - panel.add(createEditor(mmEditor, MMLABEL)); - panel.add(createOptionsPane()); - - frame.getContentPane().add(panel, CENTER); - } - - private ImageIcon reSizeIcon(ImageIcon icon, int widht, int heigh) { - Image image = icon.getImage().getScaledInstance(widht, heigh, SCALE_DEFAULT); - return new ImageIcon(image); - } - - /** - * Initialize the contents of the frame. - */ - private void createFrame() { - Dimension DimMax = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setMaximumSize(DimMax); - frame.setExtendedState(JFrame.MAXIMIZED_BOTH); - frame.setDefaultCloseOperation(EXIT_ON_CLOSE); - Image image = dat3mIcon.getImage(); - frame.setIconImage(image); - } - - /** - * Initialize the contents of the importer menu. - */ - private void createImportMenu() { - JMenuBar menuBar = new JMenuBar(); - frame.setJMenuBar(menuBar); - menuBar.add(importMenu); - } - - /** - * Initialize the program importer from the menu. - */ - private void createProgramImporter() { - List programExtensions = new ArrayList(); - programExtensions.add("litmus"); - programExtensions.add("pts"); - createImporter(programEditor, programExtensions, PROGRAM); - } - - /** - * Initialize the memory model importer from the menu. - */ - private void createMMImporter() { - List mmExtensions = new ArrayList(); - mmExtensions.add("cat"); - createImporter(mmEditor, mmExtensions, MM); - } - - /** - * Create the editor for the unrolling bound. - */ - private JPanel createUnrollingEditor() { - unrollingEditor.setText("1"); - JPanel usPane = new JPanel(new FlowLayout(LEFT)); - usPane.setBackground(BLACK); - JLabel usLabel = new JLabel("Unrolling Bound:"); - usLabel.setForeground(WHITE); - usLabel.setFont(new Font("Serif", ITALIC, 20)); - usPane.add(usLabel); - usPane.add(unrollingEditor); - usPane.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); - return usPane; - } - - /** - * Create the output console. - */ - private void createConsole() { - TitledBorder consoleBorder = new TitledBorder("Console"); - consoleBorder.setTitleJustification(TitledBorder.CENTER); - consoleBorder.setTitlePosition(TOP); - console.setEditable(false); - console.setBorder(consoleBorder); - console.setPreferredSize(new Dimension(OPTIONSWIDTH, 150)); - } - - /** - * Create a generic selector. - */ - private JPanel createSelector(JComboBox cb, String label) { - JPanel pane = new JPanel(new FlowLayout(LEFT)); - pane.setBackground(BLACK); - JLabel plabel = new JLabel(label); - plabel.setForeground(WHITE); - plabel.setFont(new Font("Serif", ITALIC, 20)); - pane.add(plabel); - pane.add(cb); - pane.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); - return pane; - } - - /** - * Create the option panel for tool parameters. - */ - private JPanel createOptionsPane() { - taskSelector.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - Object item = taskSelector.getSelectedItem(); - if (REACHABILITY.equals(item)) { - task = REACHABILITY; - } else if (PORTABILITY.equals(item)) { - task = PORTABILITY; - } - updateIcon(); - } - }); - - JPanel pane = new JPanel(); - pane.setBackground(BLACK); - // Default image - reSizeIcon(dartagnanIcon, ICONWIDTH, ICONHEIGHT); - icon.setIcon(dartagnanIcon); - pane.add(icon); - task = (Task) taskSelector.getSelectedItem(); - - taskSelector.setPreferredSize(new Dimension(336, 30)); - archSelector.setPreferredSize(new Dimension(194, 30)); - modeSelector.setPreferredSize(new Dimension(326, 30)); - aliasSelector.setPreferredSize(new Dimension(247, 30)); - - pane.add(createSelector(taskSelector, "Task:")); - pane.add(createSelector(archSelector, "Compiler Mapping:")); - pane.add(createSelector(modeSelector, "Mode:")); - pane.add(createSelector(aliasSelector, "Alias Analysis:")); - pane.add(createUnrollingEditor()); - pane.add(createTestButton()); - pane.add(console); - pane.add(createClearButton()); - - return pane; - } - - private JButton createTestButton() { - JButton testButton = new JButton("Test"); - testButton.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); - testButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if(programEditor.getText().isEmpty()) { - showMessageDialog(frame, "No program has been imported.", "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); - return; - } - if(mmEditor.getText().isEmpty()) { - showMessageDialog(frame, "No memory model has been imported.", "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); - return; - } - - Arch target = (Arch) archSelector.getSelectedItem(); - Mode mode = (Mode) modeSelector.getSelectedItem(); - Alias alias = (Alias) aliasSelector.getSelectedItem(); - int bound = parseInt(unrollingEditor.getText()); - - try { - Context ctx = new Context(); - Solver s = ctx.mkSolver(ctx.mkTactic(TACTIC)); - String result = testProgramFromEditors(s, ctx, programEditor, mmEditor, target, mode, alias, bound); - console.setText(result); - } catch (Exception exp) { - showMessageDialog(frame, exp.getMessage(), "About", INFORMATION_MESSAGE, reSizeIcon(dat3mIcon, 60, 60)); - return; - } - } - }); - return testButton; - } - - private JButton createClearButton() { - JButton clearButton = new JButton("Clear Console"); - clearButton.setPreferredSize(new Dimension(OPTIONSWIDTH, 30)); - clearButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - console.setText(""); - } - }); - return clearButton; - } - - /** - * Update the displayed image. This method will be called when the task is selected. - */ - private void updateIcon() { - ImageIcon imageIcon = null; - switch (task) { - case REACHABILITY: - imageIcon = dartagnanIcon; - break; - case PORTABILITY: - imageIcon = porthosIcon; - break; - default: - break; - } - Image image = imageIcon.getImage().getScaledInstance(ICONWIDTH, ICONHEIGHT, java.awt.Image.SCALE_DEFAULT); - imageIcon = new ImageIcon(image); - icon.setIcon(imageIcon); - } - - /** - * Create a generic importer. - */ - private void createImporter(JEditorPane editor, List extensions, Editable type) { - JFileChooser chooser = new JFileChooser(); - chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - String name = ""; - switch (type) { - case PROGRAM: - name = PROGRAMLABEL; - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.pts", "pts")); - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.litmus", "litmus")); - break; - case MM: - name = MMLABEL; - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*.cat", "cat")); - break; - default: - break; - } - JMenuItem openItem = new JMenuItem(name); - importMenu.add(openItem); - openItem.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event){ - int r=chooser.showOpenDialog(null); - if(r==APPROVE_OPTION){ - String path = chooser.getSelectedFile().getPath(); - String ext = path.substring(path.lastIndexOf('.') + 1).trim(); - if(type.equals(PROGRAM)) { - loadedFormat = "." + ext; - } - if(!extensions.contains(ext)) { - showMessageDialog(frame, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file!"); - return; - } - loadFileData(path, editor); - } - } - }); - } - - /** - * Create a generic editor with border and title. - */ - private JScrollPane createEditor(JEditorPane editor, String title) { - - TitledBorder border = new TitledBorder(title); - border.setTitleFont(new Font("Serif", ITALIC, 25)); - border.setTitleJustification(TitledBorder.CENTER); - border.setTitlePosition(TOP); - editor.setBorder(border); - return new JScrollPane(editor); - } - - /** - * Load the data of a file into a given editor. - */ - public void loadFileData(String path, JEditorPane editor) { - File file = new File(path); - Scanner fileScanner = null; - try { - fileScanner = new Scanner(file); - editor.setText(""); - - while(fileScanner.hasNextLine()) { - String line = fileScanner.nextLine(); - editor.setText(editor.getText() + line + "\n"); - } - - } catch(IOException fnfe) { - System.err.println(fnfe.getMessage()); - } - } - - public String testProgramFromEditors(Solver solver, Context ctx, JEditorPane pEditor, JEditorPane mmEditor, Arch target, Mode mode, Alias alias, int steps) { - try { - - File tmpProgramFile = new File(TMPPROGPATH + loadedFormat); - if (!tmpProgramFile.getParentFile().exists()) { - tmpProgramFile.getParentFile().mkdirs(); - } - if (!tmpProgramFile.exists()) { - tmpProgramFile.createNewFile(); - } - Writer writer = new PrintWriter(tmpProgramFile); - writer.write(pEditor.getText()); - writer.close(); - Program p = new ProgramParser().parse(TMPPROGPATH + loadedFormat); - tmpProgramFile.delete(); - - File tmpMMFile = new File(TMPMMPATH); - if (!tmpMMFile.exists()) { - tmpMMFile.createNewFile(); - } - writer = new PrintWriter(tmpMMFile); - writer.write(mmEditor.getText()); - writer.close(); - Wmm mm = new ParserCat().parse(TMPMMPATH, target); - tmpMMFile.delete(); - - String result = "Condition " + p.getAss().toStringWithType() + "\n"; - result += com.dat3m.dartagnan.Dartagnan.testProgram(solver, ctx, p, mm, target, steps, mode, alias) ? "OK" : "No"; - return result; - - } catch (IOException e) { - return e.getMessage(); - } - } -} \ No newline at end of file diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java new file mode 100644 index 0000000000..6d85619158 --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java @@ -0,0 +1,290 @@ +package com.dat3m.ui; + +import javax.swing.*; +import javax.swing.border.TitledBorder; + +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.program.utils.Alias; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.dartagnan.wmm.utils.Mode; +import com.microsoft.z3.Context; + +import com.dat3m.ui.editor.MMEditor; +import com.dat3m.ui.editor.ProgramEditor; + +import static com.dat3m.dartagnan.Dartagnan.testProgram; +import static com.dat3m.dartagnan.program.utils.Alias.CFIS; +import static com.dat3m.dartagnan.program.utils.Alias.CFS; +import static com.dat3m.dartagnan.wmm.utils.Arch.ARM; +import static com.dat3m.dartagnan.wmm.utils.Arch.ARM8; +import static com.dat3m.dartagnan.wmm.utils.Arch.POWER; +import static com.dat3m.dartagnan.wmm.utils.Arch.TSO; +import static com.dat3m.dartagnan.wmm.utils.Mode.IDL; +import static com.dat3m.dartagnan.wmm.utils.Mode.KLEENE; +import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; +import static com.dat3m.ui.Task.PORTABILITY; +import static com.dat3m.ui.Task.REACHABILITY; +import static com.dat3m.ui.editor.EditorUtils.parseMMEditor; +import static com.dat3m.ui.editor.EditorUtils.parseProgramEditor; +import static java.awt.FlowLayout.LEFT; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JOptionPane.showMessageDialog; +import static javax.swing.SwingUtilities.invokeLater; +import static javax.swing.border.TitledBorder.CENTER; + +import java.awt.*; +import java.awt.event.*; + +public class Dat3M extends JPanel implements ActionListener { + + public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { + @Override + public void paintIcon( Component c, Graphics g, int x, int y ) { + g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); + } + + @Override + public int getIconHeight() { + return 60; + } + + @Override + public int getIconWidth() { + return 60; + } + }; + + protected static final int widht = 2000; + protected static JMenuBar menuBar = new JMenuBar(); + protected static JMenu menu = new JMenu("Import"); + + protected static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + protected static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); + protected JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); + + private ProgramEditor programEditor; + private MMEditor mmEditor; + private JTextPane consolePane; + private JTextField boundField; + + protected Task task = Task.REACHABILITY; + protected Arch target = Arch.NONE; + protected Mode mode = Mode.KNASTER; + protected Alias alias = Alias.CFS; + protected int bound = 1; + + public Dat3M() { + + setLayout(new BorderLayout()); + + programEditor = new ProgramEditor(menu); + mmEditor = new MMEditor(menu); + + Task[] tasks = { REACHABILITY, PORTABILITY }; + JPanel taskPane = createSelector(tasks, "Task"); + + Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; + JPanel archPane = createSelector(archs, "Target"); + + Mode[] modes = { KNASTER, IDL, KLEENE }; + JPanel modePane = createSelector(modes, "Mode"); + + Alias[] aliases = { CFS, Alias.NONE, CFIS }; + JPanel aliasPane = createSelector(aliases, "Alias"); + + // Bound editor + boundField = new JTextField(3); + boundField.setText("1"); + boundField.setActionCommand("Bound"); + boundField.addActionListener(this); + boundField.addKeyListener(new BoundListener()); + JLabel uLabel = new JLabel("Unrolling Bound: "); + JPanel boundPane = new JPanel(new FlowLayout(LEFT)); + boundPane.add(uLabel); + boundPane.add(boundField); + + // Console. + consolePane = new JTextPane(); + consolePane.setEditable(false); + JScrollPane scrollConsole = new JScrollPane(consolePane); + scrollConsole.setMinimumSize(new Dimension(widht, 150)); + scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + // Test button. + JButton testButton = new JButton("Test"); + testButton.setMaximumSize(new Dimension(widht, 50)); + testButton.addActionListener(this); + + // Clear button. + JButton clearButton = new JButton("Clear"); + clearButton.setMaximumSize(new Dimension(widht, 50)); + clearButton.addActionListener(this); + + iconPane.setIcon(dartagnanIcon); + + //Put the options in a split pane. + JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); + JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); + JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); + JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); + JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); + JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); + JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, scrollConsole); + JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, clearButton); + + JPanel optionsPane = new JPanel(new GridLayout(1,0)); + optionsPane.setPreferredSize(new Dimension(widht / 4, 100)); + optionsPane.add(sp7); + + TitledBorder titledBorder = createTitledBorder("Options"); + titledBorder.setTitleJustification(CENTER); + optionsPane.setBorder(titledBorder); + add(optionsPane); + + //Put the editors in a split pane. + JSplitPane splitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, mmEditor); + splitEditors.setOneTouchExpandable(true); + splitEditors.setResizeWeight(0.5); + splitEditors.setPreferredSize(new Dimension(2 * widht / 3, 100)); + JPanel editorsPane = new JPanel(new GridLayout(1,0)); + editorsPane.add(splitEditors); + add(editorsPane, BorderLayout.LINE_END); + } + + private void updateTaskIcon() { + switch(task){ + case REACHABILITY: + iconPane.setIcon(dartagnanIcon); + break; + case PORTABILITY: + iconPane.setIcon(porthosIcon); + break; + } + } + + private JPanel createSelector(Object[] options, String label) { + JComboBox selector = new JComboBox(options); + selector.setActionCommand(label); + selector.addActionListener(this); + JLabel sLabel = new JLabel(label + ": "); + JPanel pane = new JPanel(new FlowLayout(LEFT)); + pane.add(sLabel); + pane.add(selector); + return pane; + } + + /** + * Create the GUI and show it. For thread safety, + * this method should be invoked from the + * event dispatch thread. + */ + private static void createAndShowGUI() { + //Create and set up the window. + JFrame frame = new JFrame("Dat3M"); + frame.setExtendedState(JFrame.MAXIMIZED_BOTH); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + menuBar.add(menu); + frame.setJMenuBar(menuBar); + + //Add content to the window. + frame.add(new Dat3M()); + + //Display the window. + frame.pack(); + frame.setVisible(true); + } + + public static void main(String[] args) { + UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); + invokeLater(new Runnable() {public void run() {createAndShowGUI();}}); + } + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + + if(boundField.getText().equals("")) { + boundField.setText("1"); + } + + if(e.getActionCommand().equals("Task")) { + Object source = e.getSource(); + if(source instanceof JComboBox) { + task = (Task) ((JComboBox)source).getSelectedItem(); + updateTaskIcon(); + } + } + + if(e.getActionCommand().equals("Target")) { + Object source = e.getSource(); + if(source instanceof JComboBox) { + target = (Arch) ((JComboBox)source).getSelectedItem(); + } + } + + if(e.getActionCommand().equals("Mode")) { + Object source = e.getSource(); + if(source instanceof JComboBox) { + mode = (Mode) ((JComboBox)source).getSelectedItem(); + } + } + + if(e.getActionCommand().equals("Alias")) { + Object source = e.getSource(); + if(source instanceof JComboBox) { + alias = (Alias) ((JComboBox)source).getSelectedItem(); + } + } + + if(e.getActionCommand().equals("Test")) { + Program p = null; + try { + //TODO: fix loadedFormat + p = parseProgramEditor(programEditor.getEditor(), "litmus"); + } catch (Exception exp) { + showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + return; + } + + Wmm mm = null; + try { + mm = parseMMEditor(mmEditor.getEditor(), target); + } catch (Exception exp) { + showMessageDialog(null, "The memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + return; + } + + String result = "Condition " + p.getAss().toStringWithType() + "\n"; + Context ctx = new Context(); + result += testProgram(ctx.mkSolver(), ctx, p, mm, target, bound, mode, alias) ? "OK" : "No"; + consolePane.setText(result); + } + + if(e.getActionCommand().equals("Clear")) { + consolePane.setText(""); + } + } + + class BoundListener implements KeyListener { + @Override + public void keyTyped(KeyEvent event) { + try { + bound = Integer.parseInt(boundField.getText()); + } catch (Exception e) { + // Nothing to do here + } + } + + @Override + public void keyPressed(KeyEvent arg0) { + // Nothing to do here + } + + @Override + public void keyReleased(KeyEvent arg0) { + // Nothing to do here + } + }; +} diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Task.java b/dat3m.ui/src/main/java/org/dat3m/ui/Task.java new file mode 100644 index 0000000000..f54cacce74 --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/Task.java @@ -0,0 +1,18 @@ +package com.dat3m.ui; + +public enum Task { + + REACHABILITY, + PORTABILITY; + + @Override + public String toString() { + switch(this){ + case REACHABILITY: + return "Reachability"; + case PORTABILITY: + return "Portability"; + } + return super.toString(); + } +} \ No newline at end of file diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java b/dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java new file mode 100644 index 0000000000..708b0aeb14 --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java @@ -0,0 +1,48 @@ +package com.dat3m.ui.editor; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; + +import javax.swing.JEditorPane; +import com.dat3m.dartagnan.parsers.cat.ParserCat; +import com.dat3m.dartagnan.parsers.program.ProgramParser; +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.utils.Arch; + +public class EditorUtils { + + static final String TMPPROGPATH = "./.tmp/program"; + static final String TMPMMPATH = "./.tmp/mm.cat"; + + public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { + File tmpProgramFile = new File(TMPPROGPATH + loadedFormat); + if (!tmpProgramFile.getParentFile().exists()) { + tmpProgramFile.getParentFile().mkdirs(); + } + if (!tmpProgramFile.exists()) { + tmpProgramFile.createNewFile(); + } + Writer writer = new PrintWriter(tmpProgramFile); + writer.write(editor.getText()); + writer.close(); + Program p = new ProgramParser().parse(TMPPROGPATH + loadedFormat); + tmpProgramFile.delete(); + return p; + } + + public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOException { + File tmpMMFile = new File(TMPMMPATH); + if (!tmpMMFile.exists()) { + tmpMMFile.createNewFile(); + } + PrintWriter writer = new PrintWriter(tmpMMFile); + writer.write(editor.getText()); + writer.close(); + Wmm mm = new ParserCat().parse(TMPMMPATH, target); + tmpMMFile.delete(); + return mm; + } +} diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java b/dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java new file mode 100644 index 0000000000..bc6d10f11f --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java @@ -0,0 +1,12 @@ +package com.dat3m.ui.editor; + +import javax.swing.JEditorPane; +import javax.swing.JFileChooser; + +public interface IEditor { + + final JFileChooser chooser = new JFileChooser(); + + public JEditorPane getEditor(); + public void createImporter(); +} diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java b/dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java new file mode 100644 index 0000000000..b02a445221 --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java @@ -0,0 +1,99 @@ +package com.dat3m.ui.editor; + +import static java.lang.System.getProperty; +import static java.util.stream.Collectors.joining; +import static javax.swing.BorderFactory.createCompoundBorder; +import static javax.swing.BorderFactory.createEmptyBorder; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JFileChooser.APPROVE_OPTION; +import static javax.swing.JOptionPane.showMessageDialog; +import static javax.swing.border.TitledBorder.CENTER; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JEditorPane; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; + +import com.dat3m.dartagnan.wmm.utils.Arch; + +import com.dat3m.ui.Dat3M; + +public class MMEditor extends JScrollPane implements IEditor { + + protected static final String MMLABEL = "Memory Model"; + + static List extensions = new ArrayList<>(); + + protected Arch target = Arch.NONE; + + protected JMenu menu = null; + protected static JEditorPane editor = new JEditorPane(); + + protected int widht = 700; + + public MMEditor(JMenu menu) { + super(editor); + + this.menu = menu; + this.setVerticalScrollBarPolicy( + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + this.setHorizontalScrollBarPolicy( + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + this.setPreferredSize(new Dimension(widht / 3, 100)); + TitledBorder titledBorder = createTitledBorder(MMLABEL); + titledBorder.setTitleJustification(CENTER); + this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); + + extensions.add("cat"); + + createImporter(); + } + + @Override + public void createImporter() { + + JMenuItem openItem = new JMenuItem(MMLABEL); + menu.add(openItem); + + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + for(String ext : extensions) { + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); + } + + openItem.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event){ + int r = chooser.showOpenDialog(null); + if(r == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + String ext = path.substring(path.lastIndexOf('.') + 1).trim(); + if(!extensions.contains(ext)) { + showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); + return; + } + try { + editor.read(new InputStreamReader(new FileInputStream(path)), null); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } + + @Override + public JEditorPane getEditor() { + return editor; + } +} diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java b/dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java new file mode 100644 index 0000000000..f5bce3ce8e --- /dev/null +++ b/dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java @@ -0,0 +1,99 @@ +package com.dat3m.ui.editor; + +import static java.lang.System.getProperty; +import static java.util.stream.Collectors.joining; +import static javax.swing.BorderFactory.createCompoundBorder; +import static javax.swing.BorderFactory.createEmptyBorder; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JFileChooser.APPROVE_OPTION; +import static javax.swing.JOptionPane.showMessageDialog; +import static javax.swing.border.TitledBorder.CENTER; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JEditorPane; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; + +import com.dat3m.ui.Dat3M; + +public class ProgramEditor extends JScrollPane implements IEditor { + + protected static final String PROGRAMLABEL = "Program"; + + static List extensions = new ArrayList<>(); + + protected JMenu menu = null; + protected static JEditorPane editor = new JEditorPane(); + + protected int widht = 700; + + private String loadedFormat; + + public ProgramEditor(JMenu menu) { + super(editor); + + this.menu = menu; + this.setVerticalScrollBarPolicy( + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + this.setHorizontalScrollBarPolicy( + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + this.setPreferredSize(new Dimension(widht / 3, 100)); + TitledBorder titledBorder = createTitledBorder(PROGRAMLABEL); + titledBorder.setTitleJustification(CENTER); + this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); + + extensions.add("litmus"); + extensions.add("pts"); + + createImporter(); + } + + @Override + public void createImporter() { + + JMenuItem openItem = new JMenuItem(PROGRAMLABEL); + menu.add(openItem); + + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + for(String ext : extensions) { + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); + } + + openItem.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event){ + int r = chooser.showOpenDialog(null); + if(r == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); + if(!extensions.contains(loadedFormat)) { + showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); + return; + } + try { + editor.read(new InputStreamReader(new FileInputStream(path)), null); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } + + @Override + public JEditorPane getEditor() { + return editor; + } +} \ No newline at end of file diff --git a/dat3m.ui/src/main/resources/dartagnan.jpg b/dat3m.ui/src/main/resources/dartagnan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17b019dc39b42525b4024e7502e81dc3baf7af83 GIT binary patch literal 43451 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 U_|MSEzh3_1hWvlqg#MoSe>1RC)&Kwi literal 0 HcmV?d00001 diff --git a/dat3m.ui/src/main/resources/dat3m.png b/dat3m.ui/src/main/resources/dat3m.png new file mode 100644 index 0000000000000000000000000000000000000000..16a3997916e1a55c10ff469735d008792f54e820 GIT binary patch literal 31220 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 R|gmfqD z^fry1@m^^)fvFkRD464k&S-+V$e~k4x7c0@G&90avvo2b_*r@(5946aiQ3NZq;g$T z%QQ?p`v#z;O|N(|P{A`hb|k*#mYeHFOw8-&ob66b#jhpDO9~GgFl*Z7RsHZz%fQ*2 zde$KkU5K}+$ek19iftEDd$_}loFB8O1yPaR0b8Oe45gS3#XJ#tJlLnIxp2-h`sAd| zQRIkLY2idDo<^Pp2t2seBOorBcx-QX5_;{+_c`eiba@!S4S0;|9ZKf>Z(8HC zVy4`1&EwTpWT3xODrA0Qj+ZS~ky-ba7m}BY8zc$05$g@xw10@ra3^Im z@H%;vY`X4b(nRoF;2Y`o#wzK{=Nor;v;d3Z*o!H}Bs-*(nXc@Pq`9b@cI z;t~TRLyqjB#dBD@>t|o5gSI@37`3Ws!L_YYfl*YeCnSOSSm>#W_e2fx-V#5Q?62oP z*FEN!DzU7<=JYa-HFzkW{ZCi|E*kt7@KhSs9U)@vI4R)v%Y#&L%K1ud$_enp(5XmM zJYoTrj6ld;9fKe#^endMPK~k_Yq@z4>Vz3zon*QS^qu}J(I~@eEE1G>7iXYtw=m2py($*~1w7|p6bqJtQxma_y^K=Ekp!BBDdE1y zy1EkRoZP&f6%wYy@7C5Z?v8sRq0z;b*sNnFj1rbcv9)~r``CedZ?|a$Nn#VR$kW*W z&6hUJsfR%9Al$)24|0rHwvjZhZ?`})zn9VawjLu6C!!y}mbl4@?NO}~xm%;vpHSH= zAJGEW{Fac&OXK#iUCFJGsg^QDMJ^W>4dh0HmG8Yf;&-b`xhde{z>IAjO%pzl1<_%y z8p*g4U z6&l}euDSgy%eyevEjKgs{}jyujU3L|UEJ+Oy;rK|VKV9rO-#^!EP|zJbal0>R-G<* zP%>C+Q)oC2X_@4KDkfd!Dl-rb=dx0r2d5J*Um1G!1H+=S%O00cDFL>k>tgHx z8wQd8T_})%2C%kY zF$LU~c<*APUk~kdaOgSelq3>9axe}w2LTonjcP+swfF1ckK+Jw^4m?P$bSLsRyY#i z)PuclOy78~AMj*bo$xyR3#E4o)G0oHeo0GZPrVupwJm+T;NH7*lANXEb8}VBu2Cm1 zx+mx6{xEML)@9v8+E6N8gN!06DLq3$!5278b5QTNaj4NCOGF2$d2$Z?)I`=$XSU3% zBwTMEgJrOR)fg1zCl0H8wHhXtIb>IV{ufuXtc5#f>l&M$<5WIx1#Z-aQqwd>%N?%H z!1)g4<)|MM*}<`Suh$I3RNax;CTKgGP`VSD=%PdTEJSH}k2_!GvO`Sa_j>@4wZDc{ zq=B8O_ibmUhEd&6dy4oC%3#e8VzAPemhFW?|M*`?=NO$=*LC68w$+%8lg4%$+qP}n zYHX{q&BnHEvqAHn=lwE9{$%9G8TY-<-fPV@=e37p2({J9t<2=zIDmJC-B_ytb(xMr z8dgX|j%GZXPiGP)(Q!qREeuHARGIBBKgoS(Zbu9eex3|Ema{>1qY`DaBf;P|Ng{FX zU_SE1xSWGc`zAQ&Rs$U@Qba>>;iJU0WY1FLp{cVg5vf!R^I--?=)||CEXH9 z9qDv51&@Mn9$J?9MZedeoS6b^kPHoYZftg%WR*!F+8qjN@O^{PK>{cckEj{Ojl1kp zIE$&}{u;P&V-F8eey2T^drfB-=_3eJ?49!<_}%3@RJSbrqnk5XoiddP9`0TtC9jG? zpA7SWYgs)VLyo=7b|?qY#8{OSjf~n<>1Cm(%9T; zoty%SsjsQV5eLk-NQJpjnT*>6eRT-T9H2VlH>qDc=m;fxl ziFqe#OJk~Z>H}6swh&3Olod{fHYNFDa>U3nk&6I1j)p|3Xscv@=2+3*Gh zzAo7jV!d%WDQ0Zu@6r&mZ%6z*aj>%|4&7J_!2Z40&M7af=jOFXieLP+MDaR5`Z7R!unS3q{JiDc zIv%P30j*BQ&BTcfBtFjHmnP1Ov-N}6t8`AUil$Dl@k6)FhPMeX$oWB+8nzsiGVa4k zC@u>ipH}C7MU=|=?>hrFJtC&WH58_ z0xq);Mx?y<5PV+|9HOkD;uR|G&5$gW7O?D7FtaPj~-0$gG z#1Lm=1Fg>Ek_P4R!S(HQ?-kH|EN0A_^`PIay4S=18z$`C89hRausi&?^f=6|savNf zNibsJtks`6>lr8Gh~#mU>1Jt9tye##2Zs)aX*Fu%08n_$}ST4^#-JTK>t9JA{!;1%X<6Or)i zmHQ$^awQFg=JviS&mZij`_>pxdBN=uQ3mK42Ta|H2hu2aCt^@3S*c3Kd%^HgY{Fy) zihdEyh57$Ju2SBk8?Qi)QWn}E(Hf0<7_{No3*_N6%F5;opK9E6t0A80al%OS2r?ds zw4wyP?YoYpW*SpJv6nLbCM_ewts;@ySBT-*xusDr?EI37>0ReOs)aOZ_IY@);QYGu z5RMu-a=WXWwKwhLq@#;DzkkUM#~fZc3{yU?JPwbef_J~ z7jaZxM>2Y=GWy)YP&zJod#LMMc zEiReWcrAI)%b@<=yMUis4SV%zl<6=LLcH9!T5?s;HqjLyT|>$l9Er5zAN!rT*kp_# zw_&8{4r69?Mvzz#q9U3BSdFmA*V`c*983qVn?M*|LcVpc`DMC_0x9L*Qe5-t*YdA} ziqY$kEkOvwlF8(r@9zTEudo_$DQDQK zbr;LzhoJv;p8O*+U6TB^Z07?M_zDV=T2~s$J`p6oOGd`+u}GR$#hBhan-X$ zyRaM>zfs(uFfv6LjTI{@Snz&s6<0C#P(ZL3OLJ#t+^G-P`29aWUOW!^U?IMtlA}p6 zV$yX=uI|dgMHP1G_+0LFdpwGG->z#*+)nIthY_^G?|e&deO^l$-GdmL` z@Bg%?sRhiqjOB&JbPGP3v7TU}v$)oO9(Ck+-0$UBlrtP08~a#c_4@s#_JSG>6@$hJ zl~PafxLrJOA2@QWobj+!M#sZu;!q*v>I{%(5@AvXI+(LY^SQO9l5K;ZJJfz}o#0ka z(z!1*x;5fQfO&*lOgrx#iu2%5I?9a$1=VT5zV7(njycSo z9exZ9446w60~Z@G`yOvFd*UCV$II5~w{Hm;Z|qqxw9;_(hEqzLzN2cFYmV^Kx>ke! zUuF9FPgDz>Y7mkUjq`iGhfd?R*W3NG9FY+&Mjh71MH ze9>M^il6@_5ilA%SLFdUxZ!&XP@2#`4E!QMvT<=4K5*=EKSdEg3K>XIa(Rj0Gw}ut#s_WZwUc;n$vu8z z3{|<^NKB1rW|TEcwr->5k1MxfGWgGfNC-1<(vSh>A#_+jk&8?CjsR=;wS*WyX&U!? z>Y3AJ*I19;+9`)sTdS;!GtI8YXF)~|@4?B0-bUvwRbAG3+)^0?Q4=2QmUUMKToWp^FlDHeVfWB+g?+vP_vDa!X zbi_nF$dL^#CV8`=dI(j-#dnrDAHRG3+(^hfNh@|@i9Bv0>Ka3djTx=_ndx-#M#<~3 zLb+InPa8pOc)7Va|Wo`aqF?QzAJ=A*wO>M{MR%$^$L=x)^03& zwBf>p+osKa1!}Xw4;HYeCqR%22GiCs`E{^TPkg^%t`xU$9-TtktI@duoc5H$Y zjQ?N>Ev|Gn9NN-S)**k&#dRnXp`^1U$%BF=;tYIzbbJZ!Gzjdw+(E-`6y9DAj`vX>THl>kT!iITg?`u{leJYPKEq(odH9#v-38_*gF+=dp5=_O@|P=6Oa z_WFtOUGD%5GB;z$pklUld)znk4d#N<{-6Rl2sgbWLPe#7=y?BAHx*S3r|jKQ3Yj{` zPcK&?bF{00sl-IoU(@&C0UGpS$z?yk^6qSy zfR2o;uC@_g4!O-IyLfrAoMk6-mmN4C%ev3Zmo4N>7biF63`Y`<-eEBf!Q&WXHELd> zkpv1#g27&COVKW62~=)-zx258C{bJ%dykKXD=pQuZoYK(zH9d)t9N#mB&34uehgoD z{Jj!EQ%zEAM*K34T`ke#Uut2M;PHI{_(%+Ebh;-mUsnvgExv?F=td=ZE2`>6)zz}C zZQ*)P@T4F=P!oOqw&RKUUbH`U|Ehog&MVC)D15hE0ZBQBA8pTjN78dQS=7e=Xw zx9>3~Ud;D!H9n}4TuC8zN?J}ZWg&3-;!{>SIN&rBIY=-eCpQ54x>ig`53g3QH?*jX z@nA93?)CUs)p?R%MA-Dp1iI7Cl=-^1Q=BYBvK93vy&>JR}5I=9A>c%fhnQ+TzG>v(J4I=BEM+ow)paD@e#HMe7M_YlB1s?RZ zw|6yoC`5y|t3-(LGdgMjpk9&BaAtev585j$FSL0*K{2|x0SSI(5BD2Ggt!=~m1G?3 z;N>)Si)!t_5;0F;R4VM!Br(6c;r^xW<8jONbq$Gi9UY10@FNAjVL_pb9Ne4V4xFtB z(FTQO3_mzF7BeC~dL(ojpKEKIuyRe6pQ-y^@UOjn3_g$6g`!^O#AMaRmAJC;Hzj2y zE;H1?L@_~sbNE&V?b;s=1^`+w2_4-LUw0ZO6RhgmdDvk)qSA)f`0>&>ZwpvltcTc6%!VfG$LA7U=b(?sX6@4P*v(R zEK8STjj6DpMn=3qq)^<`lbL9(2lmU{4T@av%wq`b>Ohz`!g%iZ0s}%AqEPr+38r(5nWv!+I7OD;8$***3KfiTpGZ8zjnEDyDmo~$!z4tpCmk8-0AgtW`K`4H;DmBgIfkfB!`hqJEqOY>WZZwJaLEfj25dGxn% z4UTp3;3Ps*{$HhdG~l%30CQ=uGL;TMiB+GO-?G)E*+k`OKicrKhHm$>HA3TOW+|#G zgNHBBY^kfHfNS4q#oqW_`Bm%bfn+Vw79lFRmb$Fvz>#FuF))M}c3=yi9tBN0{4B>J z7Xo6wq_T2)|Zv>!;uK;n`HU;-$t~bAjt+WQ8SV z0>$iBZ^#w1;YHrrxg}WDQWOPug_2@SU%H_YET!U-7JU9iDI_e8;N>7DMRB1NyZgK7C++93Oy9K7`;h^~>w9Qse zRwrjCoWrr=Aub zBCv`vyR{csV+Vh)eb+1(~_%MyI zT4yuZj)Fgy#gxOO45DL|l-*=1zrPt;HAI3Ds0|B}2Uv=ckw`{F_Yc-QyQ)8PC?diAAnBYR)a(@3r)gs*guI%NEEeKz%ootN#1(l){l=% z4lHzDkF@5kg`MAnt%}@f1dgy3c^yXvO{id)t(WCX+N_O83N5dV%Dc1RHMp5NqM$mC zhyU{PSFmbEHj;4J6ZYmIyF*N&419elnYM<3fY{=C|M=jQ&$cojk}H!=X*4)u=zQ zbaHCu;Q5y8;~ymO%1OU0_&-n@6&9fq6VEK=n@!TvXuH3%^4<=$CT69EHSGJ;{*r^~ zPc$~awP)(4so~FXgoS%nsxOaJfH-YLqUZt z;b7dz+}GS^QmZZXc*ype!JC&VrMG{CVH#Li>uc*#hsDI|Hf(erq<_9!O%*MF$bi|5 zI4p1Ad1}{2bgHSSK!k6_0k%Wn1+et()R9l29~;VCDv^|l8l0RY7@;ypLFv=zpzjJZ zQYL3n36J=Y$H1)+6cjWd4KN*E6RJZ9C;aypQs=q{7G?K5R%l49Ga-i*dd=J08x@@p z{P#*#C+k_LU#-hdUy=T&Jq`ix@V{WH`dU8O!0uUjYPbYf1F;EZ!+s+v4?%?|y)uS?LKXhRlkTnRGAD0@6Y2kz~%SEn(v?j$= z16K8tKL^knobk`k0q7!9>&8?nJcH1p4F1JbYl<|-Jhk{ng&tSPKN|pU_N%jF*71&v zl9IAbjJ_30V$SUvj-SULGkEYo0|v(Fq*^T}Ab;B~)iez-9PD^`;m<2~p}+*%n_+#u zQ`zr7{}FZAXw)P z-zD~c!>WBj9_vIE!x33nYUpW1k!C|Frt(x&)(lCV_|=Dhq2}1G$$(W{TAXk6*QvOq zLS38THYf}dIAT0&BG%>IC|N4K8r&!5l- zqbl{DF{7aa9|+Z&x={^5vK~4}vT`#6oILR$*q>Pxq=p$gM+5nSf_+1WY_z|QgEe3P zgdJMSo4ggR%Jc;O&E@DruNU}B6PrSYv_Q|l zl`r&nq`dsqWQdr!pFnI#X4P%x2N!{xWt`vR2c5^wL6KFH3uFYb;+^T(i%l~cZ$mRG zcSirPqq76X4WWfG-S#OSaTJCUZ|$&f0uFI-2j=i-W=;%ckf2=;OAGfJJ@+(7UwNblfVp~AEt0F3$P^0s`j> z0Sv^fyEOzh<5Pb31C-q+-pJ)P4W*^i9|k4iwBV zO0O{jyZ5`6T2Z?pcQppAk&_bI^5V+i#gp`l!}Eu!jqgXVftef9&DU{WePJQnDj-AW z?cMmlf`O^jBh>H#{WdF*p#B1EtN2j%@%aT$Qkw*LC2w>2iW88f&l&Qki)vVgE1%XS z+s&SWE@!$D}wFgLMo2fuq7An!AZv~cin2~z!;;z16*INIv1*(^%$ zE7X`ck#*pG0LHNPdcb@T z0`Jow@yKHr3m3Gnk4E>^E`flU6c1jn9j!w%iirgIkiMh)-C<7tehG>7;(CB4y7L*$ zvnW3uMHJhA;j((i`So|=wbTDE1!b9e{$(2$%$7Tq!mw;eg?CK+(=LAJ zjhK^BHXHHHC12!=05@inDQw{Ak*HP!c4+$<^&c4#H7&ADJ1S@2rda^qM@~sj!o-B! zzP1K@&tXo6P1aes*3Sf!%odIUC@LzBUYaS4Y*fdrc85uCp_m<%f&449dj888?K z#P@BT^R~w6<_!PN#u0gzq4|mph5}(Avc+Pvp#mN~3Y_aEVt&Eqx&jYZ84P?H-NIG_MA;nQAEfK{0+n;6&Np^G_Xu$jHv+q1?U6Z_NH!GZu> zq^OOLH!yQt`0%(`+W0rn@SON{Vjm*_|l<3wt9FtR4+DC)$c2ptZ#}aX^OP&hIyTELIEe$ce~db!=`gEKJBu z3Yv^TC@v`-IJg56QdV!AUO^V(vrm~IY_Ez)CL2b+N)jTaIQdzy??~n^n(Lg`>4$8z*-E`2C5KtigD_ zSMb`907+nB&L?$iXr+gih^_sRl}R8Y7~hiJguHU&@m-on1p&d;{qK$dj+Q183T{p1 z)0jed)W6DJe2#nBlQCOGF<(7j{m|(z?`shQr{uLeI77o#{U~c!iIFI2)%k_ldPzA! zzxi6EGIes-K+p%O+0_6}Lemx6_Qx()sjqXCurqrt6EV2ZfezS)EX~G@=+S9=PXEYw z*b)VOdW+C#G-$QcDG_AX+cm0>Q(;c$1`5cw2J(HQ(tj=SU+xM?shHG!`QaE-Ut0!% zhAkW3O9nf3Z!)HWGgWO~-g@pat!=K3jYP;jPC+strbO9 z?Jolk_rAU=tEIMcOH~F9rS3S$qn%JlNNPHURH|GQ07L>s16v>SKvr%=00DdaPjZ98 z$LSIb)10F6UMOr$a^|8`8tSaRg68h^Vf3ay?9ISUeq=@!#A?A~z=$>-Mj=?HF;mOn z+--QA5kAv8ZT|w;T)k*}Y31eiCiZ)!f~pLW^{>wdFK!5jgHT{}f9IcjmHu8iaxr*` zdy0U|_#T1+6j27Qs;LzXV2r%966KyxeOgfqg_#~X>#~@b80Ne;WRHI!0ri`dk3sG{ zKO)X;kB&!s*HJ7qPJ-G(!PHgj*2n&aFYp2TH>*}MOi&a_7n-YtUmSJ3p zCj?Z%l41;^_8&i0DYVn;cUX09#ktDKIdtlDxbAC(>W1njW{gKQv$rpCzI6v$ZgkSsP#f-aPL;&$eZP%Hft3wmN7T zq(0<#<;^yilnxyT@cALDG3t`p9!1$C$ZAtOCrSC*^13|lu8z;^d<>)4NMi3jrS35v z@y*>i2(u9?y|wc15d3$P!K#LbQK1xHpi&3$8_21`E_0@^2C3?+hXZ>rBkqr%vrUtr zL^Eu^spKaRn)%-^8)q`7iqF^&&X~2WVoOE=geFjA>va0*X5LmmlEZ+4>aN(cXn!jn z0*yA}Kgb$9y7p5^IqaihS)dDv!agk}|M<8xY(hwx)YPkhR$S&>eM&!Qv{KFmY)OWia}8TPu3TIH2~NXT(*7p1}GI4gsiN9{-NI)6>(0Y~qL%3A6j!mLa)6#%OW= zl(%uQ@S`A&UPGpoVVWq8>0t~IK9d)apQGI@e9WK#Y1C(1&I1|OXviLB%ZANr zb2IAH(?syq@uRD7EXQwgkKGtmIE8Zl{Zx0P17L4*4f|;*9+6i7L^98`sjZ zysBc4Llf__Grhh`Ft|AIDWd8LVnuc}rmVj?PRw7e*@@y_WOE84V9;>%0GZ<()1qyk zlYL#h%3=kuEcQ-*`-I@`WWVjvg=*F7q7UOZbom~?!3sS^kzHbd;^PBB2j10V<9AuDf3(j1>!&;JCm(%v4 z(NSYv>F$;p9bI{?-$6zjS#7&V=2UZOEF_&niw|T2zn+Pgoe%-fde6E zAz_XRDatn=r~WGG!NwW!DleoeJmz!g%86uiXuX+zsilU_^*UrMrt~hc1}a$#OFQwD zg$ixy3Ue%rzaqRb2)Sm*8Kg=$3OmxZXD)@NpI$>@nNXl4 z%%o5=m+KKBs}|BLZ~>H2+_PIe5ybzTki#S>HK^n(o;>zAL+i;LAY>J6h5>3E1~)m6 z-@>}|;&0m2IxLUrjQbxDT4N3kQPQK+K)nM0`+BsjjFGhygiG{%--gSEgV)U;J?fXq zANk6uu&1f12xQR3TQp@YLzP_KI~%R;davWKkl0f5m-BiRTJ;!3&Wf~xY5bq@PrwJR z*{cVa9vvB1M!Xe)6Zs?H`{iR{k%V&DGh*C6bgu_?_vhdy^v{#`3|lRf*MXV{3m6xp zK$OiTjY!prwC~Sv<0YP}t4&~7@QPXV1Uxzl>72W(*V1K9PEJq)zGuM(qY)`iSSn9= zkIdC-@I?LwgtX&MCAx#a67#&$f(28h+slWRE=?nOG+DR97`w z$a5YG{0!?dFbMq%NpMa|Obak~vlXSM7?LgpQj(kiq<0qdM&veJ0h zjpd0vvsy-2iw47LeLGP_q>yagVF(v*lc!t)v&y%ls?s3Sv1SSlqL3%+jHqm=V9XHHr_rnM4KKW-N6U z+dzoFvF>(ug0`y6-@d!Dvr{wD&NIX=dOz>QElDTgy0%>`gI~aADtcxqGSnxcWO)Jr z{JkP@=v`#YLHMA6-0h9m73`hCp_KSJGceVZsv%_%m?)=(|GJ7H(au*zG-;gFCn!-| z|0NU_!qyERc-E66;H+rolW@2_9IivMZiNhOH8W*){t1jnsf)PiCaD=~Fn*^!bBwR! zv8$GUP}Wm1X7@ehSk%Nnw(YM17*rpZ-GJgq(EL_^7y-{SaJZeog>q5U-x0*4Vx9Hx z{bm^tzu@d)y}144d61cg2M&?TkEM^8Por3-;`S3TkmBX{Pkvv*-z$ogdE{L`g8($v z;a@}=;p3)%C!hX<@7^Cx$gvw_E=_x_FHGLaF(75u=*>hgTK6qz>uS--|JEM79DaFv zGW3^>7>4$6Hh>WDyYoeel`n_GhUA!=*xl8LgnX&ij*PXY3$i`HYv<36BqIsZ<7G$& zfwC103RuAIxXWrqlD3s+d8aY#6i6SI-i>nFow>FjxNp#bs%U8G$PD}!f4GL90TsNp*i;l53aT!_dLK;_30jGQ zl}ek?9tCoPrj@^DO_#K?b_KFyh`}yMAfyVFE#Xy%BzPW+|oM)1&!u-V81T<(fJRi$M$_ zpsuQx5E-t8pOAtxA?G7HKRv@r_&72>Ik|t;P33rN!Xrmf_#L&$Gi4#U+rtVtCZ(g2 zLEo#@sx2)N;7a*_3L%!saHDY>4Ooafl$*tPcAo~JUM8eLTVoN}`51w{^S{9WBw$&& zK5K9O;k}kZ(8#QnJFRh}Ka|LXZhp_8bg!jlZ$5u*l9dW<)5G3!a*d z;BklQm=HCBVMfk|I~SQzB@hX)^TozL-;7=rkaADq!x-%JH+sAr%mnTF!Rf&Yjp6@k zKL*q;n+=WNq#y(iOnG>!-zEBgw_(6FP-X?b2etBZ#Q}pejA^PqI?_<#1YkR2Wa=B# zUIuazGQIb0Iu?4ZNMlk`r9u{u`;U1i8s9>wEfE;{#7Scu5bqqiJa!7TR>P1hWtZ%F$6Hsv15i> zSXK)v3DbZ5@W|jsw03nG4lVjY*U>&lv;y3|k923PCO|CK9u8=w?7wb4FxTB3780xr4t^G41!=!2_&DGdwli z0g1#L5p;nx5^ho~{q-KCc1;?DHbXx>qH}9&!`2N%8Sof49R{97guv+BvoduhgU9Ul zNCZ|e%Vow-GCeI$dcDD=YdasWOB~>K7o3x8V0Am}u0qm7fT^&6z&-z@IPJ}bKpp*Y z<))H$Y@~a|Vp0lBSV(Q6GVGc#AP{0@cW)z+e7w%l0BO^83acm{)Id`ai)gI_%aNIJ zOs8I>hFZS`Ar%v|15#Cdz)Xcdzg6U%VtA5TkdIYa8C-(QV{cK?CpT05MyJ(&XM`#o z$&gp{h5}A`V~y^0iIE!tNmwBvIcj9d6maARMGL!R=e-oY zkANWMoc6WL@TF%x$n4S^83~PxSR^2hTZr}>12=Bi*i`q8G^Z*FB?TB@i|NY6ZmL_b zoH>-Cq3fIM#g9j_I#muxsf7fy+cX7D72=%x3b3<>ib%u(RJ*(a$~JbcDD0gN(E<0_ zxQB*50K&kk@thaJg{+oxRMf==t?muwaBqYC1|^Qugg-*Fus%>=Vg%=xhk_lOqm8Ga zmNHe{*tV*{#=%CS3F_Q|BXJdt<9~K5A>6qvdb*~W_#=GJRc z{CV+ng@ierxAz<2%xpjUnMEMuZ0W!jFi`Bn;O^tNZfYwj0ZB{s}=YG z*NCZc58F0tDfakqkN;vwcJTh<>m4|bgr^$8lVbi^OfxJwW9T-DgHJqKFc{AKo$C+v z&J%38_#Y2$*#s3i{P|e5NV-o~VcU`l4ncK--x#G%hRx z$dPoW%hxKl136x4?qrPBtqWng$OQ81bJV6?=_)0O-8PgIG)a@${N7mDj3I@nDo-n+ zGJGDN-93TOyFUAee1z1~c%dQN%;UjVpOV@5t_ zpk(3~YJPqe1PJF_`0evH`f1xdv=EHL1&WH6CYd)Wf+gvc>*VTWL7qt|xqG>-)q;jXfwFb?RK>1?S3{bz+<}zp4H?zZ8Pbgo%~gqE9GUsUX5gMH-#G>1olj

K%a0c)*!$rLyTqgHV^4<=EC z6S9(nfva^8x{}w@|6)@Nnc1qdQs(7;SXdb}YBwk5hj*e(+B|vvb@~=QYqPF>(GN^_ zc1^VLz24tcPI7W{hwGJpIqYiiKuJ(xkg_=x)LL*YSg2zFq0u>=R)o84izU|~?`{o% zD=#Y+(qH}UW0Z{|CS)dtg;|xLxGeCApj^_5bl{4gqcMG;dEwjKbf6#zA0M9uk24g2 z4zK)^KEoN_;;im)E6QWHNuc)FSP>Ti>=5T_SVcXRP&J45~GSHKboZ};pazXUYDq-u=C8hRm5O(Y#fdDV=PK|2XYMbtC~-Kg^NaxwV9 zyd)GRj@0UQ^ynoE@yr#A4bJmL7;|g*)((LrF@r<$Q(N=K#>O^}GqfL!x&x1kDIUg2 zSF|8FL>WUB@am30t9s9ptf;CN@R;JEQG>PA3|xtWfr<5>A(p81JpvDoN~`fw>7mADd2an)rctmK%qBU5dfF8eThR}Z%=PQHJhUR{Ze z0v9;3f6wnbR5icZ@74pJ#YoD}55@7p8HW9n2F|{CDbj1y#Aa8LAlIQ!vZ<+1PjWhj z6&LAWrrsa%n`|%n(pNYLFyQV45kM2~_^mtm*fg1P=)#o%$X?d>fg zJv}1k(IvG-_wxF&EI;-e=qD>n>cCp)AQ(qv)6o4xX5DZmjz7Yb2^9FWO%z9x%}Vde zuVo)gvZjl%W-Q#s*Nmi-zKBcBXb`Pv2_bljTz7<`n^?*6=8?>jjgsG*GyfJ?!O0B! z7qfb2j1AAXcy2hw|9pxg@f(9@L6&i#i)q-PCah5lak=H^E*LE9u^KaGL>h*ncPy~> zP8OSC<4?0$U*PE~w>=nOC1HZth!;?Nvn?+{9c;H`J(H|4#$l$;;Okwh_d1D$@YQ3A z9nVrOf}Hl2_lovmrp&-?(_wuncfI1RsoIZPXbhafn6>b=KNJ+p6pdgbK#!|wTdm&{ zwcwwbELb~KCjYcZ9I~0>zzcEy%4|bP^f+|K+hovrzmi{;rgyu{v7!3<@~z&!_ySc- X_oz}tDEjYCXAmhddC^*7gP{KdPMow8 literal 0 HcmV?d00001 diff --git a/dat3m.ui/src/main/resources/porthos.jpg b/dat3m.ui/src/main/resources/porthos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d11af1369b71f01ba1088fdd3fcb5114190205ec GIT binary patch literal 57842 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 E0DEF4zW@LL literal 0 HcmV?d00001 From c71224ea3fde5e4ca520c8f086c63219b7122179 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 09:13:44 +0100 Subject: [PATCH 004/145] Improved screen compatibility --- dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java index 6d85619158..e4ec6ed439 100644 --- a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java +++ b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java @@ -55,7 +55,7 @@ public int getIconWidth() { } }; - protected static final int widht = 2000; + protected static final int widht = getMainScreenWidht(); protected static JMenuBar menuBar = new JMenuBar(); protected static JMenu menu = new JMenu("Import"); @@ -134,7 +134,7 @@ public Dat3M() { JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, clearButton); JPanel optionsPane = new JPanel(new GridLayout(1,0)); - optionsPane.setPreferredSize(new Dimension(widht / 4, 100)); + optionsPane.setPreferredSize(new Dimension(200, 100)); optionsPane.add(sp7); TitledBorder titledBorder = createTitledBorder("Options"); @@ -287,4 +287,13 @@ public void keyReleased(KeyEvent arg0) { // Nothing to do here } }; + + public static int getMainScreenWidht() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + for (int i = 0; i < gs.length; i++) { + return (int) Math.round(gs[i].getDisplayMode().getWidth()); + } + return 0; + } } From e12d2c0bf7803fe65891644f8685d822e7170634 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 11:12:07 +0100 Subject: [PATCH 005/145] Added extra panel to have a better clear buttom --- dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java index e4ec6ed439..c51ea2fe65 100644 --- a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java +++ b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java @@ -108,7 +108,7 @@ public Dat3M() { consolePane = new JTextPane(); consolePane.setEditable(false); JScrollPane scrollConsole = new JScrollPane(consolePane); - scrollConsole.setMinimumSize(new Dimension(widht, 150)); + scrollConsole.setMinimumSize(new Dimension(0, 150)); scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); // Test button. @@ -132,14 +132,15 @@ public Dat3M() { JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, scrollConsole); JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, clearButton); + JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, new JPanel()); JPanel optionsPane = new JPanel(new GridLayout(1,0)); - optionsPane.setPreferredSize(new Dimension(200, 100)); - optionsPane.add(sp7); + optionsPane.add(sp8); TitledBorder titledBorder = createTitledBorder("Options"); titledBorder.setTitleJustification(CENTER); optionsPane.setBorder(titledBorder); + optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); add(optionsPane); //Put the editors in a split pane. From 5f794a39e6d5bbe564ed3a3604c423f791d730cb Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 11:27:30 +0100 Subject: [PATCH 006/145] Set dat3m icon --- dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java index c51ea2fe65..2a496f0487 100644 --- a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java +++ b/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java @@ -187,7 +187,8 @@ private static void createAndShowGUI() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); menuBar.add(menu); - frame.setJMenuBar(menuBar); + frame.setJMenuBar(menuBar); + frame.setIconImage(dat3mIcon.getImage()); //Add content to the window. frame.add(new Dat3M()); From a24851afaff4b04073c1eaebc8a85c4b883c4d21 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 13:24:25 +0100 Subject: [PATCH 007/145] Changed org to com in package --- dat3m.ui/src/main/java/{org => com}/dat3m/ui/Dat3M.java | 4 +++- dat3m.ui/src/main/java/{org => com}/dat3m/ui/Task.java | 0 .../main/java/{org => com}/dat3m/ui/editor/EditorUtils.java | 0 .../src/main/java/{org => com}/dat3m/ui/editor/IEditor.java | 0 .../src/main/java/{org => com}/dat3m/ui/editor/MMEditor.java | 0 .../main/java/{org => com}/dat3m/ui/editor/ProgramEditor.java | 0 6 files changed, 3 insertions(+), 1 deletion(-) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/Dat3M.java (98%) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/Task.java (100%) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/editor/EditorUtils.java (100%) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/editor/IEditor.java (100%) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/editor/MMEditor.java (100%) rename dat3m.ui/src/main/java/{org => com}/dat3m/ui/editor/ProgramEditor.java (100%) diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3M.java similarity index 98% rename from dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java rename to dat3m.ui/src/main/java/com/dat3m/ui/Dat3M.java index 2a496f0487..3003af0148 100644 --- a/dat3m.ui/src/main/java/org/dat3m/ui/Dat3M.java +++ b/dat3m.ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -74,6 +74,8 @@ public int getIconWidth() { protected Alias alias = Alias.CFS; protected int bound = 1; + private JSplitPane splitEditors; + public Dat3M() { setLayout(new BorderLayout()); @@ -144,7 +146,7 @@ public Dat3M() { add(optionsPane); //Put the editors in a split pane. - JSplitPane splitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, mmEditor); + splitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, mmEditor); splitEditors.setOneTouchExpandable(true); splitEditors.setResizeWeight(0.5); splitEditors.setPreferredSize(new Dimension(2 * widht / 3, 100)); diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/Task.java b/dat3m.ui/src/main/java/com/dat3m/ui/Task.java similarity index 100% rename from dat3m.ui/src/main/java/org/dat3m/ui/Task.java rename to dat3m.ui/src/main/java/com/dat3m/ui/Task.java diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java b/dat3m.ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java similarity index 100% rename from dat3m.ui/src/main/java/org/dat3m/ui/editor/EditorUtils.java rename to dat3m.ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java b/dat3m.ui/src/main/java/com/dat3m/ui/editor/IEditor.java similarity index 100% rename from dat3m.ui/src/main/java/org/dat3m/ui/editor/IEditor.java rename to dat3m.ui/src/main/java/com/dat3m/ui/editor/IEditor.java diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java b/dat3m.ui/src/main/java/com/dat3m/ui/editor/MMEditor.java similarity index 100% rename from dat3m.ui/src/main/java/org/dat3m/ui/editor/MMEditor.java rename to dat3m.ui/src/main/java/com/dat3m/ui/editor/MMEditor.java diff --git a/dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java b/dat3m.ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java similarity index 100% rename from dat3m.ui/src/main/java/org/dat3m/ui/editor/ProgramEditor.java rename to dat3m.ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java From 8b671f66398d1cded0fd8c9b9f3157a76c49869b Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Mon, 25 Feb 2019 16:10:16 +0200 Subject: [PATCH 008/145] Fixed directory structure and pom --- pom.xml | 2 +- {dat3m.ui => ui}/.gitignore | 0 {dat3m.ui => ui}/pom.xml | 14 ++++---------- .../src/main/java/com/dat3m/ui/Dat3M.java | 0 .../src/main/java/com/dat3m/ui/Task.java | 0 .../java/com/dat3m/ui/editor/EditorUtils.java | 0 .../main/java/com/dat3m/ui/editor/IEditor.java | 0 .../main/java/com/dat3m/ui/editor/MMEditor.java | 0 .../java/com/dat3m/ui/editor/ProgramEditor.java | 0 {dat3m.ui => ui}/src/main/resources/dartagnan.jpg | Bin {dat3m.ui => ui}/src/main/resources/dat3m.png | Bin {dat3m.ui => ui}/src/main/resources/porthos.jpg | Bin 12 files changed, 5 insertions(+), 11 deletions(-) rename {dat3m.ui => ui}/.gitignore (100%) rename {dat3m.ui => ui}/pom.xml (88%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/Dat3M.java (100%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/Task.java (100%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/editor/EditorUtils.java (100%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/editor/IEditor.java (100%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/editor/MMEditor.java (100%) rename {dat3m.ui => ui}/src/main/java/com/dat3m/ui/editor/ProgramEditor.java (100%) rename {dat3m.ui => ui}/src/main/resources/dartagnan.jpg (100%) rename {dat3m.ui => ui}/src/main/resources/dat3m.png (100%) rename {dat3m.ui => ui}/src/main/resources/porthos.jpg (100%) diff --git a/pom.xml b/pom.xml index 9c701de44f..4003d9a999 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,6 @@ dartagnan porthos - dat3m.ui + ui \ No newline at end of file diff --git a/dat3m.ui/.gitignore b/ui/.gitignore similarity index 100% rename from dat3m.ui/.gitignore rename to ui/.gitignore diff --git a/dat3m.ui/pom.xml b/ui/pom.xml similarity index 88% rename from dat3m.ui/pom.xml rename to ui/pom.xml index 6303a4fdb1..3c0842dcd3 100644 --- a/dat3m.ui/pom.xml +++ b/ui/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.dat3m dat3m + com.dat3m 2.0.1 @@ -13,17 +13,12 @@ ui jar - dat3m.ui + ui - com.microsoft - z3 - 4.3.2 - - - com.dat3m.dartagnan - dartagnan + com.dat3m.porthos + porthos 2.0.1 @@ -65,5 +60,4 @@ - diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/Dat3M.java rename to ui/src/main/java/com/dat3m/ui/Dat3M.java diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/Task.java b/ui/src/main/java/com/dat3m/ui/Task.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/Task.java rename to ui/src/main/java/com/dat3m/ui/Task.java diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java b/ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java rename to ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/editor/IEditor.java b/ui/src/main/java/com/dat3m/ui/editor/IEditor.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/editor/IEditor.java rename to ui/src/main/java/com/dat3m/ui/editor/IEditor.java diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/editor/MMEditor.java b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/editor/MMEditor.java rename to ui/src/main/java/com/dat3m/ui/editor/MMEditor.java diff --git a/dat3m.ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java b/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java similarity index 100% rename from dat3m.ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java rename to ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java diff --git a/dat3m.ui/src/main/resources/dartagnan.jpg b/ui/src/main/resources/dartagnan.jpg similarity index 100% rename from dat3m.ui/src/main/resources/dartagnan.jpg rename to ui/src/main/resources/dartagnan.jpg diff --git a/dat3m.ui/src/main/resources/dat3m.png b/ui/src/main/resources/dat3m.png similarity index 100% rename from dat3m.ui/src/main/resources/dat3m.png rename to ui/src/main/resources/dat3m.png diff --git a/dat3m.ui/src/main/resources/porthos.jpg b/ui/src/main/resources/porthos.jpg similarity index 100% rename from dat3m.ui/src/main/resources/porthos.jpg rename to ui/src/main/resources/porthos.jpg From 614579c0a07036331d80cbd3e602d11a8a062986 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 16:07:42 +0100 Subject: [PATCH 009/145] Fixed getMainScreenWidth --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 3003af0148..f1b2b41607 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -55,7 +55,7 @@ public int getIconWidth() { } }; - protected static final int widht = getMainScreenWidht(); + protected static final int widht = getMainScreenWidth(); protected static JMenuBar menuBar = new JMenuBar(); protected static JMenu menu = new JMenu("Import"); @@ -292,11 +292,11 @@ public void keyReleased(KeyEvent arg0) { } }; - public static int getMainScreenWidht() { + public static int getMainScreenWidth() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); - for (int i = 0; i < gs.length; i++) { - return (int) Math.round(gs[i].getDisplayMode().getWidth()); + if (gs.length > 0) { + return (int) Math.round(gs[0].getDisplayMode().getWidth()); } return 0; } From ca964cca8fa5439f8ab26c2618a94c78c3301415 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 25 Feb 2019 17:19:59 +0100 Subject: [PATCH 010/145] Splitted editors, but problem when adjusting size --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 50 ++++++++++++++++--- .../java/com/dat3m/ui/editor/MMEditor.java | 12 +++-- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index f1b2b41607..6c61d9b7fe 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -56,6 +56,7 @@ public int getIconWidth() { }; protected static final int widht = getMainScreenWidth(); + protected static final int height = getMainScreenHeight(); protected static JMenuBar menuBar = new JMenuBar(); protected static JMenu menu = new JMenu("Import"); @@ -65,6 +66,8 @@ public int getIconWidth() { private ProgramEditor programEditor; private MMEditor mmEditor; + private MMEditor smmEditor; + private MMEditor tmmEditor; private JTextPane consolePane; private JTextField boundField; @@ -74,15 +77,17 @@ public int getIconWidth() { protected Alias alias = Alias.CFS; protected int bound = 1; - private JSplitPane splitEditors; + private JSplitPane vSplitEditors; public Dat3M() { setLayout(new BorderLayout()); programEditor = new ProgramEditor(menu); - mmEditor = new MMEditor(menu); - + mmEditor = new MMEditor(menu, new JEditorPane(), "Memory Model"); + smmEditor = new MMEditor(menu, new JEditorPane(), "Source Memory Model"); + tmmEditor = new MMEditor(menu, new JEditorPane(), "Target Memory Model"); + Task[] tasks = { REACHABILITY, PORTABILITY }; JPanel taskPane = createSelector(tasks, "Task"); @@ -146,12 +151,17 @@ public Dat3M() { add(optionsPane); //Put the editors in a split pane. - splitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, mmEditor); - splitEditors.setOneTouchExpandable(true); - splitEditors.setResizeWeight(0.5); - splitEditors.setPreferredSize(new Dimension(2 * widht / 3, 100)); + vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + vSplitEditors.setOneTouchExpandable(true); + vSplitEditors.setResizeWeight(0.5); + vSplitEditors.setTopComponent(mmEditor); + + JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, vSplitEditors); + hSplitEditors.setOneTouchExpandable(true); + hSplitEditors.setResizeWeight(0.5); + hSplitEditors.setPreferredSize(new Dimension(2 * widht / 3, 100)); JPanel editorsPane = new JPanel(new GridLayout(1,0)); - editorsPane.add(splitEditors); + editorsPane.add(hSplitEditors); add(editorsPane, BorderLayout.LINE_END); } @@ -166,6 +176,20 @@ private void updateTaskIcon() { } } + private void updateMMEditors() { + switch(task){ + case REACHABILITY: + vSplitEditors.removeAll(); + vSplitEditors.setTopComponent(mmEditor); + break; + case PORTABILITY: + vSplitEditors.removeAll(); + vSplitEditors.setTopComponent(smmEditor); + vSplitEditors.setBottomComponent(tmmEditor); + break; + } + } + private JPanel createSelector(Object[] options, String label) { JComboBox selector = new JComboBox(options); selector.setActionCommand(label); @@ -218,6 +242,7 @@ public void actionPerformed(ActionEvent e) { if(source instanceof JComboBox) { task = (Task) ((JComboBox)source).getSelectedItem(); updateTaskIcon(); + updateMMEditors(); } } @@ -300,4 +325,13 @@ public static int getMainScreenWidth() { } return 0; } + + public static int getMainScreenHeight() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + if (gs.length > 0) { + return (int) Math.round(gs[0].getDisplayMode().getHeight()); + } + return 0; + } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java index b02a445221..8a86cc4821 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java @@ -32,27 +32,29 @@ public class MMEditor extends JScrollPane implements IEditor { - protected static final String MMLABEL = "Memory Model"; + private String label; static List extensions = new ArrayList<>(); protected Arch target = Arch.NONE; protected JMenu menu = null; - protected static JEditorPane editor = new JEditorPane(); + protected JEditorPane editor; protected int widht = 700; - public MMEditor(JMenu menu) { + public MMEditor(JMenu menu, JEditorPane editor, String label) { super(editor); this.menu = menu; + this.editor = editor; + this.label = label; this.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); this.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); this.setPreferredSize(new Dimension(widht / 3, 100)); - TitledBorder titledBorder = createTitledBorder(MMLABEL); + TitledBorder titledBorder = createTitledBorder(label); titledBorder.setTitleJustification(CENTER); this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); @@ -64,7 +66,7 @@ public MMEditor(JMenu menu) { @Override public void createImporter() { - JMenuItem openItem = new JMenuItem(MMLABEL); + JMenuItem openItem = new JMenuItem(label); menu.add(openItem); chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); From 6df5fe30ddf783b8a3367788718a83a0a0f05bd7 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 13:00:53 +0100 Subject: [PATCH 011/145] Better panels display --- .../main/java/com/dat3m/porthos/Porthos.java | 2 +- .../java/com/dat3m/porthos/PorthosResult.java | 6 +- ui/src/main/java/com/dat3m/ui/Dat3M.java | 87 ++++++++++++------- 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index d421523a86..75d41bf196 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -133,7 +133,7 @@ public static void main(String[] args) throws IOException { ctx.close(); } - static PorthosResult testProgram(Solver s1, Solver s2, Context ctx, Program pSource, Program pTarget, Arch source, Arch target, + public static PorthosResult testProgram(Solver s1, Solver s2, Context ctx, Program pSource, Program pTarget, Arch source, Arch target, Wmm sourceWmm, Wmm targetWmm, int steps, Mode mode, Alias alias){ pSource.unroll(steps); diff --git a/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java b/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java index d5fb4210bf..38e2cab26d 100644 --- a/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java +++ b/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java @@ -2,7 +2,7 @@ import com.dat3m.dartagnan.program.Program; -class PorthosResult { +public class PorthosResult { private boolean isPortable; private int iterations; @@ -16,11 +16,11 @@ class PorthosResult { this.targetProgram = targetProgram; } - boolean getIsPortable(){ + public boolean getIsPortable(){ return isPortable; } - int getIterations(){ + public int getIterations(){ return iterations; } diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 6c61d9b7fe..936c44bc4c 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -8,8 +8,9 @@ import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.porthos.Porthos; +import com.dat3m.porthos.PorthosResult; import com.microsoft.z3.Context; - import com.dat3m.ui.editor.MMEditor; import com.dat3m.ui.editor.ProgramEditor; @@ -28,6 +29,8 @@ import static com.dat3m.ui.editor.EditorUtils.parseMMEditor; import static com.dat3m.ui.editor.EditorUtils.parseProgramEditor; import static java.awt.FlowLayout.LEFT; +import static javax.swing.BorderFactory.createCompoundBorder; +import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.JOptionPane.showMessageDialog; import static javax.swing.SwingUtilities.invokeLater; @@ -65,7 +68,6 @@ public int getIconWidth() { protected JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); private ProgramEditor programEditor; - private MMEditor mmEditor; private MMEditor smmEditor; private MMEditor tmmEditor; private JTextPane consolePane; @@ -83,10 +85,12 @@ public Dat3M() { setLayout(new BorderLayout()); - programEditor = new ProgramEditor(menu); - mmEditor = new MMEditor(menu, new JEditorPane(), "Memory Model"); - smmEditor = new MMEditor(menu, new JEditorPane(), "Source Memory Model"); + programEditor = new ProgramEditor(menu); + programEditor.setMinimumSize(new Dimension(widht / 3, 100)); + smmEditor = new MMEditor(menu, new JEditorPane(), "Memory Model"); + smmEditor.setMinimumSize(new Dimension(100, height / 3)); tmmEditor = new MMEditor(menu, new JEditorPane(), "Target Memory Model"); + tmmEditor.setMinimumSize(new Dimension(100, height / 3)); Task[] tasks = { REACHABILITY, PORTABILITY }; JPanel taskPane = createSelector(tasks, "Task"); @@ -137,32 +141,32 @@ public Dat3M() { JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); - JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, scrollConsole); - JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, clearButton); - JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, new JPanel()); + JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); + JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, scrollConsole); JPanel optionsPane = new JPanel(new GridLayout(1,0)); - optionsPane.add(sp8); + optionsPane.add(sp7); TitledBorder titledBorder = createTitledBorder("Options"); titledBorder.setTitleJustification(CENTER); optionsPane.setBorder(titledBorder); optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); - add(optionsPane); //Put the editors in a split pane. vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + vSplitEditors.setTopComponent(smmEditor); vSplitEditors.setOneTouchExpandable(true); - vSplitEditors.setResizeWeight(0.5); - vSplitEditors.setTopComponent(mmEditor); + vSplitEditors.setDividerSize(2); + vSplitEditors.setDividerLocation(0.5); + vSplitEditors.setMinimumSize(new Dimension(widht / 3, 100)); JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, vSplitEditors); hSplitEditors.setOneTouchExpandable(true); - hSplitEditors.setResizeWeight(0.5); - hSplitEditors.setPreferredSize(new Dimension(2 * widht / 3, 100)); - JPanel editorsPane = new JPanel(new GridLayout(1,0)); - editorsPane.add(hSplitEditors); - add(editorsPane, BorderLayout.LINE_END); + hSplitEditors.setDividerLocation(0.4); + hSplitEditors.setDividerSize(2); + + JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, hSplitEditors); + add(mainPane); } private void updateTaskIcon() { @@ -177,17 +181,21 @@ private void updateTaskIcon() { } private void updateMMEditors() { - switch(task){ + TitledBorder titledBorder = createTitledBorder(""); + titledBorder.setTitleJustification(CENTER); + switch(task){ case REACHABILITY: - vSplitEditors.removeAll(); - vSplitEditors.setTopComponent(mmEditor); + if(vSplitEditors.getBottomComponent() == tmmEditor) { + vSplitEditors.remove(tmmEditor); + } + titledBorder.setTitle("Memory Model"); break; case PORTABILITY: - vSplitEditors.removeAll(); - vSplitEditors.setTopComponent(smmEditor); vSplitEditors.setBottomComponent(tmmEditor); + titledBorder.setTitle("Source Memory Model"); break; } + smmEditor.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); } private JPanel createSelector(Object[] options, String label) { @@ -270,25 +278,44 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Test")) { Program p = null; try { - //TODO: fix loadedFormat - p = parseProgramEditor(programEditor.getEditor(), "litmus"); + p = parseProgramEditor(programEditor.getEditor(), "pts"); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } - Wmm mm = null; + Wmm smm = null; + try { + smm = parseMMEditor(smmEditor.getEditor(), target); + } catch (Exception exp) { + showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + return; + } + + Wmm tmm = null; try { - mm = parseMMEditor(mmEditor.getEditor(), target); + tmm = parseMMEditor(tmmEditor.getEditor(), target); } catch (Exception exp) { - showMessageDialog(null, "The memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The target memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } - String result = "Condition " + p.getAss().toStringWithType() + "\n"; Context ctx = new Context(); - result += testProgram(ctx.mkSolver(), ctx, p, mm, target, bound, mode, alias) ? "OK" : "No"; - consolePane.setText(result); + String result = ""; + + switch(task){ + case REACHABILITY: + result = "Condition " + p.getAss().toStringWithType() + "\n"; + result += testProgram(ctx.mkSolver(), ctx, p, smm, target, bound, mode, alias) ? "OK" : "No"; + break; + case PORTABILITY: + PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, p, p, target, target, + smm, tmm, bound, mode, alias); + String baseRel = res.getIsPortable()? " " : " not "; + result = "The program is" + baseRel + "state-portable \nIterations: " + res.getIterations(); + break; + } + consolePane.setText(result); } if(e.getActionCommand().equals("Clear")) { From 266af0b3df8220bdd0cd699c1eb48e89b79c376d Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 13:56:25 +0100 Subject: [PATCH 012/145] Added source option --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 44 ++++++++++++++++-------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 936c44bc4c..4f2a18ac29 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -3,6 +3,7 @@ import javax.swing.*; import javax.swing.border.TitledBorder; +import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.Wmm; @@ -75,6 +76,7 @@ public int getIconWidth() { protected Task task = Task.REACHABILITY; protected Arch target = Arch.NONE; + protected Arch source = Arch.NONE; protected Mode mode = Mode.KNASTER; protected Alias alias = Alias.CFS; protected int bound = 1; @@ -96,7 +98,9 @@ public Dat3M() { JPanel taskPane = createSelector(tasks, "Task"); Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; - JPanel archPane = createSelector(archs, "Target"); + JPanel sArchPane = createSelector(archs, "Target"); + JPanel tArchPane = createSelector(archs, "Source"); + JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tArchPane, sArchPane); Mode[] modes = { KNASTER, IDL, KLEENE }; JPanel modePane = createSelector(modes, "Mode"); @@ -261,6 +265,13 @@ public void actionPerformed(ActionEvent e) { } } + if(e.getActionCommand().equals("Source")) { + Object source = e.getSource(); + if(source instanceof JComboBox) { + source = (Arch) ((JComboBox)source).getSelectedItem(); + } + } + if(e.getActionCommand().equals("Mode")) { Object source = e.getSource(); if(source instanceof JComboBox) { @@ -276,28 +287,31 @@ public void actionPerformed(ActionEvent e) { } if(e.getActionCommand().equals("Test")) { - Program p = null; + Program pSource = null; + Program pTarget = null; try { - p = parseProgramEditor(programEditor.getEditor(), "pts"); + pSource = parseProgramEditor(programEditor.getEditor(), "pts"); + pTarget = parseProgramEditor(programEditor.getEditor(), "pts"); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } Wmm smm = null; + Wmm tmm = null; try { smm = parseMMEditor(smmEditor.getEditor(), target); } catch (Exception exp) { showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } - - Wmm tmm = null; - try { - tmm = parseMMEditor(tmmEditor.getEditor(), target); - } catch (Exception exp) { - showMessageDialog(null, "The target memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); - return; + if(task == Task.PORTABILITY) { + try { + tmm = parseMMEditor(tmmEditor.getEditor(), target); + } catch (Exception exp) { + showMessageDialog(null, "The target memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + return; + } } Context ctx = new Context(); @@ -305,14 +319,14 @@ public void actionPerformed(ActionEvent e) { switch(task){ case REACHABILITY: - result = "Condition " + p.getAss().toStringWithType() + "\n"; - result += testProgram(ctx.mkSolver(), ctx, p, smm, target, bound, mode, alias) ? "OK" : "No"; + result = "Condition " + pSource.getAss().toStringWithType() + "\n"; + result += testProgram(ctx.mkSolver(), ctx, pSource, smm, target, bound, mode, alias) ? "OK" : "No"; break; case PORTABILITY: - PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, p, p, target, target, + PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, source, target, smm, tmm, bound, mode, alias); - String baseRel = res.getIsPortable()? " " : " not "; - result = "The program is" + baseRel + "state-portable \nIterations: " + res.getIterations(); + String dummy = res.getIsPortable()? " " : " not "; + result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); break; } consolePane.setText(result); From 914566ffdd708e18ab0a94616dbc129a6b327897 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 14:02:48 +0100 Subject: [PATCH 013/145] De-activate source option for reachability --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 4f2a18ac29..9b465e7eb2 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -82,6 +82,9 @@ public int getIconWidth() { protected int bound = 1; private JSplitPane vSplitEditors; + private JSplitPane archPane; + private JPanel sArchPane; + private JPanel tArchPane; public Dat3M() { @@ -98,9 +101,11 @@ public Dat3M() { JPanel taskPane = createSelector(tasks, "Task"); Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; - JPanel sArchPane = createSelector(archs, "Target"); - JPanel tArchPane = createSelector(archs, "Source"); - JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tArchPane, sArchPane); + tArchPane = createSelector(archs, "Target"); + sArchPane = createSelector(archs, "Source"); + archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + archPane.setRightComponent(tArchPane); + Mode[] modes = { KNASTER, IDL, KLEENE }; JPanel modePane = createSelector(modes, "Mode"); @@ -193,10 +198,14 @@ private void updateMMEditors() { vSplitEditors.remove(tmmEditor); } titledBorder.setTitle("Memory Model"); + if(archPane.getLeftComponent() == sArchPane) { + archPane.remove(sArchPane); + } break; case PORTABILITY: vSplitEditors.setBottomComponent(tmmEditor); titledBorder.setTitle("Source Memory Model"); + archPane.setLeftComponent(sArchPane); break; } smmEditor.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); From c37aa5e074412698da2a41bcf1ef90c5f148f631 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 16:38:23 +0100 Subject: [PATCH 014/145] Menu items updated correctly. Needs re-factoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 92 ++++++++++++------- .../java/com/dat3m/ui/ImporterMenuItem.java | 53 +++++++++++ .../java/com/dat3m/ui/editor/MMEditor.java | 6 +- .../com/dat3m/ui/editor/ProgramEditor.java | 8 +- 4 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 9b465e7eb2..dedf79bc24 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -3,7 +3,6 @@ import javax.swing.*; import javax.swing.border.TitledBorder; -import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.Wmm; @@ -39,9 +38,14 @@ import java.awt.*; import java.awt.event.*; +import java.util.ArrayList; public class Dat3M extends JPanel implements ActionListener { + private static final String MMLABEL = "Memory Model"; + private static final String SMMLABEL = "Source Memory Model"; + private static final String TMMLABEL = "Target Memory Model"; + public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -85,6 +89,13 @@ public int getIconWidth() { private JSplitPane archPane; private JPanel sArchPane; private JPanel tArchPane; + private JFileChooser chooser = new JFileChooser(); + + private ImporterMenuItem smmMenuIte; + + private ImporterMenuItem pMenuItem; + + private ImporterMenuItem tmmMenuIte; public Dat3M() { @@ -92,10 +103,22 @@ public Dat3M() { programEditor = new ProgramEditor(menu); programEditor.setMinimumSize(new Dimension(widht / 3, 100)); - smmEditor = new MMEditor(menu, new JEditorPane(), "Memory Model"); + ArrayList pExtensions = new ArrayList(); + pExtensions.add("litmus"); + pExtensions.add("pts"); + pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, programEditor.getEditor()); + menu.add(pMenuItem); + + smmEditor = new MMEditor(menu, new JEditorPane(), SMMLABEL); smmEditor.setMinimumSize(new Dimension(100, height / 3)); - tmmEditor = new MMEditor(menu, new JEditorPane(), "Target Memory Model"); + ArrayList mmExtensions = new ArrayList(); + mmExtensions.add("cat"); + smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor.getEditor()); + + tmmEditor = new MMEditor(menu, new JEditorPane(), MMLABEL); tmmEditor.setMinimumSize(new Dimension(100, height / 3)); + tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor.getEditor()); + menu.add(tmmMenuIte); Task[] tasks = { REACHABILITY, PORTABILITY }; JPanel taskPane = createSelector(tasks, "Task"); @@ -106,7 +129,6 @@ public Dat3M() { archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); archPane.setRightComponent(tArchPane); - Mode[] modes = { KNASTER, IDL, KLEENE }; JPanel modePane = createSelector(modes, "Mode"); @@ -163,7 +185,7 @@ public Dat3M() { //Put the editors in a split pane. vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - vSplitEditors.setTopComponent(smmEditor); + vSplitEditors.setBottomComponent(tmmEditor); vSplitEditors.setOneTouchExpandable(true); vSplitEditors.setDividerSize(2); vSplitEditors.setDividerLocation(0.5); @@ -178,37 +200,45 @@ public Dat3M() { add(mainPane); } - private void updateTaskIcon() { - switch(task){ - case REACHABILITY: - iconPane.setIcon(dartagnanIcon); - break; - case PORTABILITY: - iconPane.setIcon(porthosIcon); - break; - } - } - - private void updateMMEditors() { + private void updateGUIonTask() { TitledBorder titledBorder = createTitledBorder(""); titledBorder.setTitleJustification(CENTER); switch(task){ case REACHABILITY: - if(vSplitEditors.getBottomComponent() == tmmEditor) { - vSplitEditors.remove(tmmEditor); + // Update image + iconPane.setIcon(dartagnanIcon); + // Remove smmEditor + if(vSplitEditors.getTopComponent() == smmEditor) { + vSplitEditors.remove(smmEditor); } - titledBorder.setTitle("Memory Model"); + // Update editor and menutItem labels + titledBorder.setTitle(MMLABEL); + menu.getItem(1).setText(MMLABEL); + // Remove source selection option if(archPane.getLeftComponent() == sArchPane) { archPane.remove(sArchPane); } + // Remove source memory model importer item + if(menu.getItemCount() > 2 && menu.getItem(2) == smmMenuIte) { + menu.remove(smmMenuIte); + } break; case PORTABILITY: - vSplitEditors.setBottomComponent(tmmEditor); - titledBorder.setTitle("Source Memory Model"); - archPane.setLeftComponent(sArchPane); + // Update image + iconPane.setIcon(porthosIcon); + // Add smmEditor + vSplitEditors.setTopComponent(smmEditor); + // Update editor and menutItem labels + titledBorder.setTitle(TMMLABEL); + menu.getItem(1).setText(TMMLABEL); + // Add source selection option + archPane.setLeftComponent(tArchPane); + // Add source memory model importer item + menu.add(smmMenuIte); break; } - smmEditor.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); + consolePane.setText(""); + tmmEditor.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); } private JPanel createSelector(Object[] options, String label) { @@ -262,8 +292,7 @@ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if(source instanceof JComboBox) { task = (Task) ((JComboBox)source).getSelectedItem(); - updateTaskIcon(); - updateMMEditors(); + updateGUIonTask(); } } @@ -309,16 +338,17 @@ public void actionPerformed(ActionEvent e) { Wmm smm = null; Wmm tmm = null; try { - smm = parseMMEditor(smmEditor.getEditor(), target); + tmm = parseMMEditor(tmmEditor.getEditor(), target); } catch (Exception exp) { - showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + String dummy = task == REACHABILITY ? " " : " target "; + showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } if(task == Task.PORTABILITY) { try { - tmm = parseMMEditor(tmmEditor.getEditor(), target); + smm = parseMMEditor(smmEditor.getEditor(), source); } catch (Exception exp) { - showMessageDialog(null, "The target memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; } } @@ -329,7 +359,7 @@ public void actionPerformed(ActionEvent e) { switch(task){ case REACHABILITY: result = "Condition " + pSource.getAss().toStringWithType() + "\n"; - result += testProgram(ctx.mkSolver(), ctx, pSource, smm, target, bound, mode, alias) ? "OK" : "No"; + result += testProgram(ctx.mkSolver(), ctx, pSource, tmm, target, bound, mode, alias) ? "OK" : "No"; break; case PORTABILITY: PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, source, target, diff --git a/ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java b/ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java new file mode 100644 index 0000000000..f58cf13477 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java @@ -0,0 +1,53 @@ +package com.dat3m.ui; + +import static java.lang.System.getProperty; +import static java.util.stream.Collectors.joining; +import static javax.swing.JFileChooser.APPROVE_OPTION; +import static javax.swing.JOptionPane.showMessageDialog; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; + +import javax.swing.JEditorPane; +import javax.swing.JFileChooser; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.filechooser.FileNameExtensionFilter; + +public class ImporterMenuItem extends JMenuItem { + + public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor) { + super(label); + + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + for(String ext : extensions) { + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); + } + + addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event){ + int r = chooser.showOpenDialog(null); + if(r == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + String ext = path.substring(path.lastIndexOf('.') + 1).trim(); + if(!extensions.contains(ext)) { + showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); + return; + } + try { + editor.read(new InputStreamReader(new FileInputStream(path)), null); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + + } + +} diff --git a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java index 8a86cc4821..175689443f 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java @@ -46,7 +46,7 @@ public class MMEditor extends JScrollPane implements IEditor { public MMEditor(JMenu menu, JEditorPane editor, String label) { super(editor); - this.menu = menu; + //this.menu = menu; this.editor = editor; this.label = label; this.setVerticalScrollBarPolicy( @@ -58,9 +58,9 @@ public MMEditor(JMenu menu, JEditorPane editor, String label) { titledBorder.setTitleJustification(CENTER); this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); - extensions.add("cat"); + //extensions.add("cat"); - createImporter(); + //createImporter(); } @Override diff --git a/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java b/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java index f5bce3ce8e..d96bafc074 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java @@ -45,7 +45,7 @@ public class ProgramEditor extends JScrollPane implements IEditor { public ProgramEditor(JMenu menu) { super(editor); - this.menu = menu; + //this.menu = menu; this.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); this.setHorizontalScrollBarPolicy( @@ -55,10 +55,10 @@ public ProgramEditor(JMenu menu) { titledBorder.setTitleJustification(CENTER); this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); - extensions.add("litmus"); - extensions.add("pts"); + //extensions.add("litmus"); + //extensions.add("pts"); - createImporter(); + //createImporter(); } @Override From d301ff923f626d071deb93e2e04861cc799efae0 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 18:23:14 +0100 Subject: [PATCH 015/145] Some refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 122 ++++++++++-------- .../java/com/dat3m/ui/editor/IEditor.java | 12 -- .../java/com/dat3m/ui/editor/MMEditor.java | 101 --------------- .../com/dat3m/ui/editor/ProgramEditor.java | 99 -------------- 4 files changed, 66 insertions(+), 268 deletions(-) delete mode 100644 ui/src/main/java/com/dat3m/ui/editor/IEditor.java delete mode 100644 ui/src/main/java/com/dat3m/ui/editor/MMEditor.java delete mode 100644 ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index dedf79bc24..a6b4c3c1c4 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -11,8 +11,6 @@ import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; import com.microsoft.z3.Context; -import com.dat3m.ui.editor.MMEditor; -import com.dat3m.ui.editor.ProgramEditor; import static com.dat3m.dartagnan.Dartagnan.testProgram; import static com.dat3m.dartagnan.program.utils.Alias.CFIS; @@ -42,11 +40,16 @@ public class Dat3M extends JPanel implements ActionListener { + private static final String PROGRAMLABEL = "Program"; private static final String MMLABEL = "Memory Model"; private static final String SMMLABEL = "Source Memory Model"; private static final String TMMLABEL = "Target Memory Model"; + + private static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + private static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { + // Used in ImporterMenuItem + protected static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); @@ -63,62 +66,57 @@ public int getIconWidth() { } }; - protected static final int widht = getMainScreenWidth(); - protected static final int height = getMainScreenHeight(); - protected static JMenuBar menuBar = new JMenuBar(); - protected static JMenu menu = new JMenu("Import"); - - protected static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); - protected static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - protected JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); - - private ProgramEditor programEditor; - private MMEditor smmEditor; - private MMEditor tmmEditor; - private JTextPane consolePane; - private JTextField boundField; - - protected Task task = Task.REACHABILITY; - protected Arch target = Arch.NONE; - protected Arch source = Arch.NONE; - protected Mode mode = Mode.KNASTER; - protected Alias alias = Alias.CFS; - protected int bound = 1; - - private JSplitPane vSplitEditors; + private static final int widht = getMainScreenWidth(); + private static final int height = getMainScreenHeight(); + + // All these panes are fields since they need to be updated by the listener + private static JMenu menu = new JMenu("Import"); + private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); + // Editors and Menu Items + private static JEditorPane pEditor = new JEditorPane(); + private static JSplitPane vSplitEditors; + private static JScrollPane smmScroll; + private static JEditorPane smmEditor = new JEditorPane(); + private static ImporterMenuItem smmMenuIte; + private static JScrollPane tmmScroll; + private static JEditorPane tmmEditor = new JEditorPane(); + private static ImporterMenuItem tmmMenuIte; + // Options + private static JTextPane consolePane; + private static JTextField boundField; private JSplitPane archPane; private JPanel sArchPane; private JPanel tArchPane; - private JFileChooser chooser = new JFileChooser(); - - private ImporterMenuItem smmMenuIte; - - private ImporterMenuItem pMenuItem; - - private ImporterMenuItem tmmMenuIte; + + // All these are fields since they need to be updated by the listener + private static Task task = Task.REACHABILITY; + private static Arch target = Arch.NONE; + private static Arch source = Arch.NONE; + private static Mode mode = Mode.KNASTER; + private static Alias alias = Alias.CFS; + private static int bound = 1; public Dat3M() { setLayout(new BorderLayout()); - - programEditor = new ProgramEditor(menu); - programEditor.setMinimumSize(new Dimension(widht / 3, 100)); + JFileChooser chooser = new JFileChooser(); + ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); - pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, programEditor.getEditor()); - menu.add(pMenuItem); - - smmEditor = new MMEditor(menu, new JEditorPane(), SMMLABEL); - smmEditor.setMinimumSize(new Dimension(100, height / 3)); + ImporterMenuItem pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor); + ArrayList mmExtensions = new ArrayList(); mmExtensions.add("cat"); - smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor.getEditor()); + smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor); + tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor); - tmmEditor = new MMEditor(menu, new JEditorPane(), MMLABEL); - tmmEditor.setMinimumSize(new Dimension(100, height / 3)); - tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor.getEditor()); + menu.add(pMenuItem); menu.add(tmmMenuIte); + + JScrollPane pScroll = createScroll(pEditor, PROGRAMLABEL); + smmScroll = createScroll(smmEditor, SMMLABEL); + tmmScroll = createScroll(tmmEditor, MMLABEL); Task[] tasks = { REACHABILITY, PORTABILITY }; JPanel taskPane = createSelector(tasks, "Task"); @@ -185,13 +183,13 @@ public Dat3M() { //Put the editors in a split pane. vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - vSplitEditors.setBottomComponent(tmmEditor); + vSplitEditors.setBottomComponent(tmmScroll); vSplitEditors.setOneTouchExpandable(true); vSplitEditors.setDividerSize(2); vSplitEditors.setDividerLocation(0.5); - vSplitEditors.setMinimumSize(new Dimension(widht / 3, 100)); + vSplitEditors.setPreferredSize(new Dimension(widht / 3, height / 3)); - JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, programEditor, vSplitEditors); + JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pScroll, vSplitEditors); hSplitEditors.setOneTouchExpandable(true); hSplitEditors.setDividerLocation(0.4); hSplitEditors.setDividerSize(2); @@ -200,6 +198,17 @@ public Dat3M() { add(mainPane); } + private JScrollPane createScroll(JEditorPane editor, String label) { + JScrollPane pScroll = new JScrollPane(editor); + pScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + pScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + pScroll.setPreferredSize(new Dimension(widht / 3, height / 3)); + TitledBorder pTitledBorder = createTitledBorder(label); + pTitledBorder.setTitleJustification(CENTER); + pScroll.setBorder(createCompoundBorder(pTitledBorder, createEmptyBorder(5,5,5,5))); + return pScroll; + } + private void updateGUIonTask() { TitledBorder titledBorder = createTitledBorder(""); titledBorder.setTitleJustification(CENTER); @@ -208,8 +217,8 @@ private void updateGUIonTask() { // Update image iconPane.setIcon(dartagnanIcon); // Remove smmEditor - if(vSplitEditors.getTopComponent() == smmEditor) { - vSplitEditors.remove(smmEditor); + if(vSplitEditors.getTopComponent() == smmScroll) { + vSplitEditors.remove(smmScroll); } // Update editor and menutItem labels titledBorder.setTitle(MMLABEL); @@ -227,7 +236,7 @@ private void updateGUIonTask() { // Update image iconPane.setIcon(porthosIcon); // Add smmEditor - vSplitEditors.setTopComponent(smmEditor); + vSplitEditors.setTopComponent(smmScroll); // Update editor and menutItem labels titledBorder.setTitle(TMMLABEL); menu.getItem(1).setText(TMMLABEL); @@ -238,7 +247,7 @@ private void updateGUIonTask() { break; } consolePane.setText(""); - tmmEditor.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); + tmmScroll.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); } private JPanel createSelector(Object[] options, String label) { @@ -263,6 +272,7 @@ private static void createAndShowGUI() { frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); frame.setJMenuBar(menuBar); frame.setIconImage(dat3mIcon.getImage()); @@ -328,8 +338,8 @@ public void actionPerformed(ActionEvent e) { Program pSource = null; Program pTarget = null; try { - pSource = parseProgramEditor(programEditor.getEditor(), "pts"); - pTarget = parseProgramEditor(programEditor.getEditor(), "pts"); + pSource = parseProgramEditor(pEditor, "pts"); + pTarget = parseProgramEditor(pEditor, "pts"); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; @@ -338,7 +348,7 @@ public void actionPerformed(ActionEvent e) { Wmm smm = null; Wmm tmm = null; try { - tmm = parseMMEditor(tmmEditor.getEditor(), target); + tmm = parseMMEditor(tmmEditor, target); } catch (Exception exp) { String dummy = task == REACHABILITY ? " " : " target "; showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); @@ -346,7 +356,7 @@ public void actionPerformed(ActionEvent e) { } if(task == Task.PORTABILITY) { try { - smm = parseMMEditor(smmEditor.getEditor(), source); + smm = parseMMEditor(smmEditor, source); } catch (Exception exp) { showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; diff --git a/ui/src/main/java/com/dat3m/ui/editor/IEditor.java b/ui/src/main/java/com/dat3m/ui/editor/IEditor.java deleted file mode 100644 index bc6d10f11f..0000000000 --- a/ui/src/main/java/com/dat3m/ui/editor/IEditor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dat3m.ui.editor; - -import javax.swing.JEditorPane; -import javax.swing.JFileChooser; - -public interface IEditor { - - final JFileChooser chooser = new JFileChooser(); - - public JEditorPane getEditor(); - public void createImporter(); -} diff --git a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java b/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java deleted file mode 100644 index 175689443f..0000000000 --- a/ui/src/main/java/com/dat3m/ui/editor/MMEditor.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.dat3m.ui.editor; - -import static java.lang.System.getProperty; -import static java.util.stream.Collectors.joining; -import static javax.swing.BorderFactory.createCompoundBorder; -import static javax.swing.BorderFactory.createEmptyBorder; -import static javax.swing.BorderFactory.createTitledBorder; -import static javax.swing.JFileChooser.APPROVE_OPTION; -import static javax.swing.JOptionPane.showMessageDialog; -import static javax.swing.border.TitledBorder.CENTER; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JEditorPane; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.border.TitledBorder; -import javax.swing.filechooser.FileNameExtensionFilter; - -import com.dat3m.dartagnan.wmm.utils.Arch; - -import com.dat3m.ui.Dat3M; - -public class MMEditor extends JScrollPane implements IEditor { - - private String label; - - static List extensions = new ArrayList<>(); - - protected Arch target = Arch.NONE; - - protected JMenu menu = null; - protected JEditorPane editor; - - protected int widht = 700; - - public MMEditor(JMenu menu, JEditorPane editor, String label) { - super(editor); - - //this.menu = menu; - this.editor = editor; - this.label = label; - this.setVerticalScrollBarPolicy( - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - this.setHorizontalScrollBarPolicy( - JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - this.setPreferredSize(new Dimension(widht / 3, 100)); - TitledBorder titledBorder = createTitledBorder(label); - titledBorder.setTitleJustification(CENTER); - this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); - - //extensions.add("cat"); - - //createImporter(); - } - - @Override - public void createImporter() { - - JMenuItem openItem = new JMenuItem(label); - menu.add(openItem); - - chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - for(String ext : extensions) { - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); - } - - openItem.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event){ - int r = chooser.showOpenDialog(null); - if(r == APPROVE_OPTION){ - String path = chooser.getSelectedFile().getPath(); - String ext = path.substring(path.lastIndexOf('.') + 1).trim(); - if(!extensions.contains(ext)) { - showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); - return; - } - try { - editor.read(new InputStreamReader(new FileInputStream(path)), null); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }); - } - - @Override - public JEditorPane getEditor() { - return editor; - } -} diff --git a/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java b/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java deleted file mode 100644 index d96bafc074..0000000000 --- a/ui/src/main/java/com/dat3m/ui/editor/ProgramEditor.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dat3m.ui.editor; - -import static java.lang.System.getProperty; -import static java.util.stream.Collectors.joining; -import static javax.swing.BorderFactory.createCompoundBorder; -import static javax.swing.BorderFactory.createEmptyBorder; -import static javax.swing.BorderFactory.createTitledBorder; -import static javax.swing.JFileChooser.APPROVE_OPTION; -import static javax.swing.JOptionPane.showMessageDialog; -import static javax.swing.border.TitledBorder.CENTER; - -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JEditorPane; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.border.TitledBorder; -import javax.swing.filechooser.FileNameExtensionFilter; - -import com.dat3m.ui.Dat3M; - -public class ProgramEditor extends JScrollPane implements IEditor { - - protected static final String PROGRAMLABEL = "Program"; - - static List extensions = new ArrayList<>(); - - protected JMenu menu = null; - protected static JEditorPane editor = new JEditorPane(); - - protected int widht = 700; - - private String loadedFormat; - - public ProgramEditor(JMenu menu) { - super(editor); - - //this.menu = menu; - this.setVerticalScrollBarPolicy( - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - this.setHorizontalScrollBarPolicy( - JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - this.setPreferredSize(new Dimension(widht / 3, 100)); - TitledBorder titledBorder = createTitledBorder(PROGRAMLABEL); - titledBorder.setTitleJustification(CENTER); - this.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); - - //extensions.add("litmus"); - //extensions.add("pts"); - - //createImporter(); - } - - @Override - public void createImporter() { - - JMenuItem openItem = new JMenuItem(PROGRAMLABEL); - menu.add(openItem); - - chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - for(String ext : extensions) { - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); - } - - openItem.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event){ - int r = chooser.showOpenDialog(null); - if(r == APPROVE_OPTION){ - String path = chooser.getSelectedFile().getPath(); - loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); - if(!extensions.contains(loadedFormat)) { - showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); - return; - } - try { - editor.read(new InputStreamReader(new FileInputStream(path)), null); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }); - } - - @Override - public JEditorPane getEditor() { - return editor; - } -} \ No newline at end of file From 3288d3429055965de6bb9cfbebb4435ed0190f35 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 18:29:55 +0100 Subject: [PATCH 016/145] More refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 12 +++++++----- .../com/dat3m/ui/{editor => utils}/EditorUtils.java | 2 +- .../com/dat3m/ui/{ => utils}/ImporterMenuItem.java | 4 +++- ui/src/main/java/com/dat3m/ui/{ => utils}/Task.java | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) rename ui/src/main/java/com/dat3m/ui/{editor => utils}/EditorUtils.java (98%) rename ui/src/main/java/com/dat3m/ui/{ => utils}/ImporterMenuItem.java (96%) rename ui/src/main/java/com/dat3m/ui/{ => utils}/Task.java (91%) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a6b4c3c1c4..1798667764 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,6 +10,8 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.utils.ImporterMenuItem; +import com.dat3m.ui.utils.Task; import com.microsoft.z3.Context; import static com.dat3m.dartagnan.Dartagnan.testProgram; @@ -22,10 +24,10 @@ import static com.dat3m.dartagnan.wmm.utils.Mode.IDL; import static com.dat3m.dartagnan.wmm.utils.Mode.KLEENE; import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; -import static com.dat3m.ui.Task.PORTABILITY; -import static com.dat3m.ui.Task.REACHABILITY; -import static com.dat3m.ui.editor.EditorUtils.parseMMEditor; -import static com.dat3m.ui.editor.EditorUtils.parseProgramEditor; +import static com.dat3m.ui.utils.Task.PORTABILITY; +import static com.dat3m.ui.utils.Task.REACHABILITY; +import static com.dat3m.ui.utils.EditorUtils.parseMMEditor; +import static com.dat3m.ui.utils.EditorUtils.parseProgramEditor; import static java.awt.FlowLayout.LEFT; import static javax.swing.BorderFactory.createCompoundBorder; import static javax.swing.BorderFactory.createEmptyBorder; @@ -49,7 +51,7 @@ public class Dat3M extends JPanel implements ActionListener { private static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); // Used in ImporterMenuItem - protected static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { + public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java similarity index 98% rename from ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java rename to ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java index 708b0aeb14..0117ec5506 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.editor; +package com.dat3m.ui.utils; import java.io.File; import java.io.IOException; diff --git a/ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java similarity index 96% rename from ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java rename to ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java index f58cf13477..59828387d9 100644 --- a/ui/src/main/java/com/dat3m/ui/ImporterMenuItem.java +++ b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java @@ -1,4 +1,4 @@ -package com.dat3m.ui; +package com.dat3m.ui.utils; import static java.lang.System.getProperty; import static java.util.stream.Collectors.joining; @@ -19,6 +19,8 @@ import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; +import com.dat3m.ui.Dat3M; + public class ImporterMenuItem extends JMenuItem { public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor) { diff --git a/ui/src/main/java/com/dat3m/ui/Task.java b/ui/src/main/java/com/dat3m/ui/utils/Task.java similarity index 91% rename from ui/src/main/java/com/dat3m/ui/Task.java rename to ui/src/main/java/com/dat3m/ui/utils/Task.java index f54cacce74..4edfa09663 100644 --- a/ui/src/main/java/com/dat3m/ui/Task.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Task.java @@ -1,4 +1,4 @@ -package com.dat3m.ui; +package com.dat3m.ui.utils; public enum Task { From 3d4349572ca67d72716c6f39188d95d988337375 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 18:48:09 +0100 Subject: [PATCH 017/145] Loaded format --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 12 +++++++----- .../java/com/dat3m/ui/utils/ImporterMenuItem.java | 10 ++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 1798667764..d1e425c49d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -76,6 +76,7 @@ public int getIconWidth() { private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); // Editors and Menu Items private static JEditorPane pEditor = new JEditorPane(); + private ImporterMenuItem pMenuItem; private static JSplitPane vSplitEditors; private static JScrollPane smmScroll; private static JEditorPane smmEditor = new JEditorPane(); @@ -106,8 +107,8 @@ public Dat3M() { ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); - ImporterMenuItem pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor); - + pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor); + ArrayList mmExtensions = new ArrayList(); mmExtensions.add("cat"); smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor); @@ -340,8 +341,8 @@ public void actionPerformed(ActionEvent e) { Program pSource = null; Program pTarget = null; try { - pSource = parseProgramEditor(pEditor, "pts"); - pTarget = parseProgramEditor(pEditor, "pts"); + //TODO: fix the extension + pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); return; @@ -357,7 +358,8 @@ public void actionPerformed(ActionEvent e) { return; } if(task == Task.PORTABILITY) { - try { + try { + pTarget = parseProgramEditor(pEditor, "pts"); smm = parseMMEditor(smmEditor, source); } catch (Exception exp) { showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); diff --git a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java index 59828387d9..73c46e3540 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java +++ b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java @@ -23,6 +23,8 @@ public class ImporterMenuItem extends JMenuItem { + String loadedFormat = ""; + public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor) { super(label); @@ -36,8 +38,8 @@ public void actionPerformed(ActionEvent event){ int r = chooser.showOpenDialog(null); if(r == APPROVE_OPTION){ String path = chooser.getSelectedFile().getPath(); - String ext = path.substring(path.lastIndexOf('.') + 1).trim(); - if(!extensions.contains(ext)) { + loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); + if(!extensions.contains(loadedFormat)) { showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); return; } @@ -52,4 +54,8 @@ public void actionPerformed(ActionEvent event){ } + public String getLoadedFormat() { + return loadedFormat; + } + } From 8bf327c0c5d81b3c4d2d0ec4c6688ca8771d7f58 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Feb 2019 18:48:27 +0100 Subject: [PATCH 018/145] Loaded format --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index d1e425c49d..83f5546e2a 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -341,7 +341,6 @@ public void actionPerformed(ActionEvent e) { Program pSource = null; Program pTarget = null; try { - //TODO: fix the extension pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); From 76d7c0d1676b06b8f7ffb5095b1830885428be55 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Feb 2019 10:57:07 +0100 Subject: [PATCH 019/145] More refactoring and solve problem with bound listener --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 76 ++++++++++--------- .../com/dat3m/ui/utils/ImporterMenuItem.java | 7 +- .../main/java/com/dat3m/ui/utils/Option.java | 73 ++++++++++++++++++ 3 files changed, 116 insertions(+), 40 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/utils/Option.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 83f5546e2a..1c534acf3d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -11,6 +11,7 @@ import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; import com.dat3m.ui.utils.ImporterMenuItem; +import com.dat3m.ui.utils.Option; import com.dat3m.ui.utils.Task; import com.microsoft.z3.Context; @@ -32,6 +33,7 @@ import static javax.swing.BorderFactory.createCompoundBorder; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JOptionPane.INFORMATION_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog; import static javax.swing.SwingUtilities.invokeLater; import static javax.swing.border.TitledBorder.CENTER; @@ -76,7 +78,7 @@ public int getIconWidth() { private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); // Editors and Menu Items private static JEditorPane pEditor = new JEditorPane(); - private ImporterMenuItem pMenuItem; + private static ImporterMenuItem pMenuItem; private static JSplitPane vSplitEditors; private static JScrollPane smmScroll; private static JEditorPane smmEditor = new JEditorPane(); @@ -84,20 +86,13 @@ public int getIconWidth() { private static JScrollPane tmmScroll; private static JEditorPane tmmEditor = new JEditorPane(); private static ImporterMenuItem tmmMenuIte; - // Options + // Options pane private static JTextPane consolePane; private static JTextField boundField; - private JSplitPane archPane; - private JPanel sArchPane; - private JPanel tArchPane; - - // All these are fields since they need to be updated by the listener - private static Task task = Task.REACHABILITY; - private static Arch target = Arch.NONE; - private static Arch source = Arch.NONE; - private static Mode mode = Mode.KNASTER; - private static Alias alias = Alias.CFS; - private static int bound = 1; + private static JSplitPane archPane; + private static JPanel sArchPane; + private static JPanel tArchPane; + private Option opt = new Option(REACHABILITY, Arch.NONE, Arch.NONE, KNASTER, CFS, 1); public Dat3M() { @@ -115,6 +110,7 @@ public Dat3M() { tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor); menu.add(pMenuItem); + // Initially only one MM can be loaded menu.add(tmmMenuIte); JScrollPane pScroll = createScroll(pEditor, PROGRAMLABEL); @@ -175,12 +171,10 @@ public Dat3M() { JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, scrollConsole); - JPanel optionsPane = new JPanel(new GridLayout(1,0)); - optionsPane.add(sp7); - TitledBorder titledBorder = createTitledBorder("Options"); titledBorder.setTitleJustification(CENTER); + optionsPane.add(sp7); optionsPane.setBorder(titledBorder); optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); @@ -215,7 +209,7 @@ private JScrollPane createScroll(JEditorPane editor, String label) { private void updateGUIonTask() { TitledBorder titledBorder = createTitledBorder(""); titledBorder.setTitleJustification(CENTER); - switch(task){ + switch(opt.getTask()){ case REACHABILITY: // Update image iconPane.setIcon(dartagnanIcon); @@ -249,6 +243,7 @@ private void updateGUIonTask() { menu.add(smmMenuIte); break; } + // The console is cleaned when the task is changed consolePane.setText(""); tmmScroll.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); } @@ -297,6 +292,7 @@ public static void main(String[] args) { @Override public void actionPerformed(ActionEvent e) { + // The bound field cannot be empty if(boundField.getText().equals("")) { boundField.setText("1"); } @@ -304,7 +300,7 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Task")) { Object source = e.getSource(); if(source instanceof JComboBox) { - task = (Task) ((JComboBox)source).getSelectedItem(); + opt.setTak((Task) ((JComboBox)source).getSelectedItem()); updateGUIonTask(); } } @@ -312,28 +308,28 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Target")) { Object source = e.getSource(); if(source instanceof JComboBox) { - target = (Arch) ((JComboBox)source).getSelectedItem(); + opt.setTarget((Arch) ((JComboBox)source).getSelectedItem()); } } if(e.getActionCommand().equals("Source")) { Object source = e.getSource(); if(source instanceof JComboBox) { - source = (Arch) ((JComboBox)source).getSelectedItem(); + opt.setSource((Arch) ((JComboBox)source).getSelectedItem()); } } if(e.getActionCommand().equals("Mode")) { Object source = e.getSource(); if(source instanceof JComboBox) { - mode = (Mode) ((JComboBox)source).getSelectedItem(); + opt.setMode((Mode) ((JComboBox)source).getSelectedItem()); } } if(e.getActionCommand().equals("Alias")) { Object source = e.getSource(); if(source instanceof JComboBox) { - alias = (Alias) ((JComboBox)source).getSelectedItem(); + opt.setAlias((Alias) ((JComboBox)source).getSelectedItem()); } } @@ -343,25 +339,25 @@ public void actionPerformed(ActionEvent e) { try { pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); } catch (Exception exp) { - showMessageDialog(null, "The program was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); return; } Wmm smm = null; Wmm tmm = null; try { - tmm = parseMMEditor(tmmEditor, target); + tmm = parseMMEditor(tmmEditor, opt.getTarget()); } catch (Exception exp) { - String dummy = task == REACHABILITY ? " " : " target "; - showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + String dummy = opt.getTask() == REACHABILITY ? " " : " target "; + showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); return; } - if(task == Task.PORTABILITY) { + if(opt.getTask() == PORTABILITY) { try { pTarget = parseProgramEditor(pEditor, "pts"); - smm = parseMMEditor(smmEditor, source); + smm = parseMMEditor(smmEditor, opt.getSource()); } catch (Exception exp) { - showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", JOptionPane.INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); return; } } @@ -369,14 +365,14 @@ public void actionPerformed(ActionEvent e) { Context ctx = new Context(); String result = ""; - switch(task){ + switch(opt.getTask()){ case REACHABILITY: result = "Condition " + pSource.getAss().toStringWithType() + "\n"; - result += testProgram(ctx.mkSolver(), ctx, pSource, tmm, target, bound, mode, alias) ? "OK" : "No"; + result += testProgram(ctx.mkSolver(), ctx, pSource, tmm, opt.getTarget(), opt.getBound(), opt.getMode(), opt.getAlias()) ? "OK" : "No"; break; case PORTABILITY: - PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, source, target, - smm, tmm, bound, mode, alias); + PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), + smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); String dummy = res.getIsPortable()? " " : " not "; result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); break; @@ -393,7 +389,7 @@ class BoundListener implements KeyListener { @Override public void keyTyped(KeyEvent event) { try { - bound = Integer.parseInt(boundField.getText()); + opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here } @@ -401,12 +397,20 @@ public void keyTyped(KeyEvent event) { @Override public void keyPressed(KeyEvent arg0) { - // Nothing to do here + try { + opt.setBound(Integer.parseInt(boundField.getText())); + } catch (Exception e) { + // Nothing to do here + } } @Override public void keyReleased(KeyEvent arg0) { - // Nothing to do here + try { + opt.setBound(Integer.parseInt(boundField.getText())); + } catch (Exception e) { + // Nothing to do here + } } }; diff --git a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java index 73c46e3540..a9b118b093 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java +++ b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java @@ -1,8 +1,10 @@ package com.dat3m.ui.utils; +import static com.dat3m.ui.Dat3M.dat3mIcon; import static java.lang.System.getProperty; import static java.util.stream.Collectors.joining; import static javax.swing.JFileChooser.APPROVE_OPTION; +import static javax.swing.JOptionPane.INFORMATION_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog; import java.awt.event.ActionEvent; @@ -16,11 +18,8 @@ import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JMenuItem; -import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; -import com.dat3m.ui.Dat3M; - public class ImporterMenuItem extends JMenuItem { String loadedFormat = ""; @@ -40,7 +39,7 @@ public void actionPerformed(ActionEvent event){ String path = chooser.getSelectedFile().getPath(); loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); if(!extensions.contains(loadedFormat)) { - showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", JOptionPane.INFORMATION_MESSAGE, Dat3M.dat3mIcon); + showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", INFORMATION_MESSAGE, dat3mIcon); return; } try { diff --git a/ui/src/main/java/com/dat3m/ui/utils/Option.java b/ui/src/main/java/com/dat3m/ui/utils/Option.java new file mode 100644 index 0000000000..ebf29024df --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/utils/Option.java @@ -0,0 +1,73 @@ +package com.dat3m.ui.utils; + +import com.dat3m.dartagnan.program.utils.Alias; +import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.dartagnan.wmm.utils.Mode; + +public class Option { + + // All these are fields since they need to be updated by the listener + private Task task = Task.REACHABILITY; + private Arch target = Arch.NONE; + private Arch source = Arch.NONE; + private Mode mode = Mode.KNASTER; + private Alias alias = Alias.CFS; + private int bound = 1; + + public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { + this.task = task; + this.target = target; + this.source = source; + this.mode = mode; + this.alias = alias; + this.bound = bound; + } + + public Task getTask() { + return task; + } + + public void setTak(Task task) { + this.task = task; + } + + public Arch getTarget() { + return target; + } + + public void setTarget(Arch target) { + this.target = target; + } + + public Arch getSource() { + return source; + } + + public void setSource(Arch source) { + this.source = source; + } + + public Mode getMode() { + return mode; + } + + public void setMode(Mode mode) { + this.mode = mode; + } + + public Alias getAlias() { + return alias; + } + + public void setAlias(Alias alias) { + this.alias = alias; + } + + public int getBound() { + return bound; + } + + public void setBound(int bound) { + this.bound = bound; + } +} From d93382860969b2a1082ad72b57ec3082a3a39c3f Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Feb 2019 17:18:02 +0100 Subject: [PATCH 020/145] Refactor of parseEditors and priority of editor-based target rather than pane --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 23 ++++++++---- .../java/com/dat3m/ui/utils/EditorUtils.java | 36 ++++++++++--------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 1c534acf3d..8b3fcf5a9e 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -336,15 +336,14 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Test")) { Program pSource = null; Program pTarget = null; + Wmm smm = null; + Wmm tmm = null; try { - pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); + pTarget = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); } catch (Exception exp) { showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); return; } - - Wmm smm = null; - Wmm tmm = null; try { tmm = parseMMEditor(tmmEditor, opt.getTarget()); } catch (Exception exp) { @@ -353,8 +352,17 @@ public void actionPerformed(ActionEvent e) { return; } if(opt.getTask() == PORTABILITY) { + if(!pMenuItem.getLoadedFormat().equals("pts")) { + showMessageDialog(null, "Porthos only supports *.pts format", "About", INFORMATION_MESSAGE, dat3mIcon); + return; + } + try { + pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); + } catch (Exception exp) { + showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); + return; + } try { - pTarget = parseProgramEditor(pEditor, "pts"); smm = parseMMEditor(smmEditor, opt.getSource()); } catch (Exception exp) { showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); @@ -367,8 +375,9 @@ public void actionPerformed(ActionEvent e) { switch(opt.getTask()){ case REACHABILITY: - result = "Condition " + pSource.getAss().toStringWithType() + "\n"; - result += testProgram(ctx.mkSolver(), ctx, pSource, tmm, opt.getTarget(), opt.getBound(), opt.getMode(), opt.getAlias()) ? "OK" : "No"; + result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; + Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); + result += testProgram(ctx.mkSolver(), ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()) ? "OK" : "No"; break; case PORTABILITY: PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), diff --git a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java index 0117ec5506..98471a2088 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java @@ -1,6 +1,7 @@ package com.dat3m.ui.utils; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; @@ -18,7 +19,23 @@ public class EditorUtils { static final String TMPMMPATH = "./.tmp/mm.cat"; public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { - File tmpProgramFile = new File(TMPPROGPATH + loadedFormat); + String path = TMPPROGPATH + loadedFormat; + File tmpProgramFile = createTmpFile(editor, path); + Program p = new ProgramParser().parse(path); + tmpProgramFile.delete(); + return p; + } + + public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOException { + File tmpMMFile = createTmpFile(editor, TMPMMPATH); + Wmm mm = new ParserCat().parse(TMPMMPATH, target); + tmpMMFile.delete(); + return mm; + } + + private static File createTmpFile(JEditorPane editor, String path) + throws IOException, FileNotFoundException { + File tmpProgramFile = new File(path); if (!tmpProgramFile.getParentFile().exists()) { tmpProgramFile.getParentFile().mkdirs(); } @@ -27,22 +44,7 @@ public static Program parseProgramEditor(JEditorPane editor, String loadedFormat } Writer writer = new PrintWriter(tmpProgramFile); writer.write(editor.getText()); - writer.close(); - Program p = new ProgramParser().parse(TMPPROGPATH + loadedFormat); - tmpProgramFile.delete(); - return p; - } - - public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOException { - File tmpMMFile = new File(TMPMMPATH); - if (!tmpMMFile.exists()) { - tmpMMFile.createNewFile(); - } - PrintWriter writer = new PrintWriter(tmpMMFile); - writer.write(editor.getText()); writer.close(); - Wmm mm = new ParserCat().parse(TMPMMPATH, target); - tmpMMFile.delete(); - return mm; + return tmpProgramFile; } } From 55444075ba2aa1f2698c10e4fdcfebb26d4b48c7 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Feb 2019 20:11:08 +0100 Subject: [PATCH 021/145] Updated version in pom --- ui/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/pom.xml b/ui/pom.xml index 3c0842dcd3..cbefe49e34 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -6,7 +6,7 @@ dat3m com.dat3m - 2.0.1 + 2.0.2 com.dat3m.ui @@ -19,7 +19,7 @@ com.dat3m.porthos porthos - 2.0.1 + 2.0.2 From 1aadced20aab47b323cadd674faac1e325fc2f46 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Feb 2019 23:27:17 +0100 Subject: [PATCH 022/145] Graph generated in a separated frame --- .../java/com/dat3m/dartagnan/Dartagnan.java | 2 +- ui/pom.xml | 10 ++++ ui/src/main/java/com/dat3m/ui/Dat3M.java | 42 ++++++++++---- .../java/com/dat3m/ui/utils/GraphOption.java | 58 +++++++++++++++++++ 4 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/utils/GraphOption.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index 9882b8dead..bd78e375d3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -147,7 +147,7 @@ public static boolean testProgram(Solver solver, Context ctx, Program program, W return result; } - private static boolean canDrawGraph(AbstractAssert ass, boolean result){ + public static boolean canDrawGraph(AbstractAssert ass, boolean result){ String type = ass.getType(); if(type == null){ return result; diff --git a/ui/pom.xml b/ui/pom.xml index cbefe49e34..69b6fe79f6 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -21,6 +21,16 @@ porthos 2.0.2 + + guru.nidi + graphviz-java + 0.8.3 + + + ch.qos.logback + logback-classic + 1.2.3 + diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 8b3fcf5a9e..d3ddaef9a7 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,11 +10,14 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.utils.GraphOption; import com.dat3m.ui.utils.ImporterMenuItem; import com.dat3m.ui.utils.Option; import com.dat3m.ui.utils.Task; import com.microsoft.z3.Context; +import com.microsoft.z3.Solver; +import static com.dat3m.dartagnan.Dartagnan.canDrawGraph; import static com.dat3m.dartagnan.Dartagnan.testProgram; import static com.dat3m.dartagnan.program.utils.Alias.CFIS; import static com.dat3m.dartagnan.program.utils.Alias.CFS; @@ -92,7 +95,15 @@ public int getIconWidth() { private static JSplitPane archPane; private static JPanel sArchPane; private static JPanel tArchPane; - private Option opt = new Option(REACHABILITY, Arch.NONE, Arch.NONE, KNASTER, CFS, 1); + private static Option opt = new Option(REACHABILITY, Arch.NONE, Arch.NONE, KNASTER, CFS, 1); + + // Execution witness + private static GraphOption graph = new GraphOption(); + private boolean isSat = false; + private static Program pTarget; + private static Context ctx = new Context(); + private static Solver solver = ctx.mkSolver(); + private static Solver solver2 = ctx.mkSolver(); public Dat3M() { @@ -160,6 +171,11 @@ public Dat3M() { clearButton.setMaximumSize(new Dimension(widht, 50)); clearButton.addActionListener(this); + // Graph button. + JButton graphButton = new JButton("Draw Execution Witness"); + graphButton.setMaximumSize(new Dimension(widht, 50)); + graphButton.addActionListener(this); + iconPane.setIcon(dartagnanIcon); //Put the options in a split pane. @@ -170,11 +186,12 @@ public Dat3M() { JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); - JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, scrollConsole); + JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); + JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); JPanel optionsPane = new JPanel(new GridLayout(1,0)); TitledBorder titledBorder = createTitledBorder("Options"); titledBorder.setTitleJustification(CENTER); - optionsPane.add(sp7); + optionsPane.add(sp8); optionsPane.setBorder(titledBorder); optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); @@ -335,7 +352,6 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Test")) { Program pSource = null; - Program pTarget = null; Wmm smm = null; Wmm tmm = null; try { @@ -370,17 +386,16 @@ public void actionPerformed(ActionEvent e) { } } - Context ctx = new Context(); - String result = ""; - - switch(opt.getTask()){ + String result = ""; + switch(opt.getTask()){ case REACHABILITY: result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); - result += testProgram(ctx.mkSolver(), ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()) ? "OK" : "No"; + isSat = testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); + result += isSat ? "OK" : "No"; break; case PORTABILITY: - PorthosResult res = Porthos.testProgram(ctx.mkSolver(), ctx.mkSolver(), ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), + PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); String dummy = res.getIsPortable()? " " : " not "; result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); @@ -392,6 +407,13 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Clear")) { consolePane.setText(""); } + + if(e.getActionCommand().equals("Draw Execution Witness")) { + if(canDrawGraph(pTarget.getAss(), isSat)) { + graph.generate(solver, ctx, pTarget); + } + invokeLater(new Runnable() {public void run() {graph.open();}}); + } } class BoundListener implements KeyListener { diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java new file mode 100644 index 0000000000..1cab5cbb3d --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java @@ -0,0 +1,58 @@ +package com.dat3m.ui.utils; + +import static guru.nidi.graphviz.engine.Format.PNG; +import static guru.nidi.graphviz.engine.Graphviz.fromGraph; + +import java.awt.Dimension; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JScrollPane; + +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.utils.Graph; +import com.microsoft.z3.Context; +import com.microsoft.z3.Solver; + +import guru.nidi.graphviz.model.MutableGraph; +import guru.nidi.graphviz.parse.Parser; + +public class GraphOption { + + static final String TMPDOTPATH = "./.tmp/output.dot"; + static final String TMPPNGPATH = "./.tmp/output.png"; + + public GraphOption() { + + } + + public void generate(Solver solver, Context ctx, Program p) { + Graph graph = new Graph(solver.getModel(), ctx); + try { + graph.build(p).draw(TMPDOTPATH); + File initialFile = new File(TMPDOTPATH); + InputStream targetStream = new FileInputStream(initialFile); + MutableGraph g = Parser.read(targetStream); + fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); + } catch (IOException e) { + // This should never happen since the file is always created + } + } + + public void open() { + JFrame frame = new JFrame(); + JLabel label = new JLabel(); + label.setIcon(new ImageIcon(TMPPNGPATH)); + JScrollPane scrool = new JScrollPane(label); + scrool.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrool.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + frame.add(scrool); + frame.pack(); + frame.setVisible(true); + } +} From 69c75f5d8571bd2a6ab1383939b9c4b99f75f8da Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Feb 2019 23:28:23 +0100 Subject: [PATCH 023/145] clean --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- ui/src/main/java/com/dat3m/ui/utils/GraphOption.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index d3ddaef9a7..7856a1f348 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -172,7 +172,7 @@ public Dat3M() { clearButton.addActionListener(this); // Graph button. - JButton graphButton = new JButton("Draw Execution Witness"); + JButton graphButton = new JButton("Execution Witness"); graphButton.setMaximumSize(new Dimension(widht, 50)); graphButton.addActionListener(this); diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java index 1cab5cbb3d..3ed6036f56 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java @@ -3,7 +3,6 @@ import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; -import java.awt.Dimension; import java.io.File; import java.io.FileInputStream; import java.io.IOException; From 2b7c9361c94e6edb9229e2ea1fd5b02e3137c07d Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 09:21:41 +0100 Subject: [PATCH 024/145] Image scaling for disfferent displays --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 7856a1f348..14e6f791f7 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -52,25 +52,15 @@ public class Dat3M extends JPanel implements ActionListener { private static final String SMMLABEL = "Source Memory Model"; private static final String TMMLABEL = "Target Memory Model"; - private static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + private static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); private static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); // Used in ImporterMenuItem public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { - g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); - } - - @Override - public int getIconHeight() { - return 60; - } - - @Override - public int getIconWidth() { - return 60; - } + g.drawImage(getImage(), x, y, 60, 60, c); + } }; private static final int widht = getMainScreenWidth(); @@ -110,6 +100,14 @@ public Dat3M() { setLayout(new BorderLayout()); JFileChooser chooser = new JFileChooser(); + // Scales the figures + int newHeight = (int) Math.round((height / 2.5)); + int newWidth = dartagnanIcon.getIconWidth() * newHeight / dartagnanIcon.getIconHeight(); + Image newDart = dartagnanIcon.getImage().getScaledInstance(newWidth, newHeight, 1); + dartagnanIcon.setImage(newDart); + Image newPort = porthosIcon.getImage().getScaledInstance(newWidth, newHeight, 1); + porthosIcon.setImage(newPort); + ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); From f2afa83ef4b3da23c133b03a8eab50d7f15b114d Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 10:30:21 +0100 Subject: [PATCH 025/145] Added launcher - full path needs to be changed --- dat3m.desktop | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100755 dat3m.desktop diff --git a/dat3m.desktop b/dat3m.desktop new file mode 100755 index 0000000000..ad25ae67e9 --- /dev/null +++ b/dat3m.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=Dat3M +Comment=Dat3M +Exec=java -jar -Djava.library.path=/home/ponce/Dat3M/lib /home/ponce/Dat3M/ui/target/ui-2.0.2-jar-with-dependencies.jar +Icon=/home/ponce/Dat3M/ui/src/main/resources/dat3m.png +Terminal=false From f16554b1200383abb1297cf1414d512e66818e99 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 10:32:18 +0100 Subject: [PATCH 026/145] Smaller icon for small displays --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 14e6f791f7..d0c86d0533 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -101,7 +101,7 @@ public Dat3M() { JFileChooser chooser = new JFileChooser(); // Scales the figures - int newHeight = (int) Math.round((height / 2.5)); + int newHeight = (int) Math.round((height / 3)); int newWidth = dartagnanIcon.getIconWidth() * newHeight / dartagnanIcon.getIconHeight(); Image newDart = dartagnanIcon.getImage().getScaledInstance(newWidth, newHeight, 1); dartagnanIcon.setImage(newDart); From 615e0517fc078a02033e0f189ffa3378914b377f Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 12:05:58 +0100 Subject: [PATCH 027/145] Added Makefile --- Makefile | 21 +++++++++++++++++++++ dat3m.desktop | 3 +-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..2e0557be5d --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +APPPATH=$(HOME)/share/dat3m +JARPATH=./ui/target/ui-2.0.2-jar-with-dependencies.jar +JARNAME=dat3m.jar +ICONPATH=./ui/src/main/resources/dat3m.png + +.PHONY: all install + +all: install + +install: + mkdir -p $(APPPATH) + cp $(JARPATH) $(APPPATH)/$(JARNAME) + cp $(ICONPATH) $(APPPATH) + echo '[Desktop Entry]' > ./dat3m.desktop + echo 'Type=Application' >> ./dat3m.desktop + echo 'Name=Dat3M' >> ./dat3m.desktop + echo 'Comment=Dat3M' >> ./dat3m.desktop + echo 'Terminal=false' >> ./dat3m.desktop + echo 'Exec=java -jar -Djava.library.path=./Dat3M/lib '$(APPPATH)/$(JARNAME) >> ./dat3m.desktop + echo 'Icon='$(APPPATH)'/dat3m.png' >> ./dat3m.desktop + chmod +x "./dat3m.desktop" diff --git a/dat3m.desktop b/dat3m.desktop index ad25ae67e9..be62eda4f8 100755 --- a/dat3m.desktop +++ b/dat3m.desktop @@ -2,6 +2,5 @@ Type=Application Name=Dat3M Comment=Dat3M -Exec=java -jar -Djava.library.path=/home/ponce/Dat3M/lib /home/ponce/Dat3M/ui/target/ui-2.0.2-jar-with-dependencies.jar -Icon=/home/ponce/Dat3M/ui/src/main/resources/dat3m.png Terminal=false + From abda2ebf5fcd9dd976d3c6d98298bdce836a8e35 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 12:55:40 +0100 Subject: [PATCH 028/145] Resize dat3m icon in error msg --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index d0c86d0533..e3a8cf71c6 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -59,7 +59,17 @@ public class Dat3M extends JPanel implements ActionListener { public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { - g.drawImage(getImage(), x, y, 60, 60, c); + g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); + } + + @Override + public int getIconHeight() { + return 60; + } + + @Override + public int getIconWidth() { + return 60; } }; From 30c26ae1cfa70dbd0e0dd0d2e8785e4d03fc8f99 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 13:06:17 +0100 Subject: [PATCH 029/145] Added mvn commands in Makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 2e0557be5d..3945cc4651 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,8 @@ ICONPATH=./ui/src/main/resources/dat3m.png all: install install: + mvn install:install-file -Dfile=lib/z3-4.3.2.jar -DgroupId=com.microsoft -DartifactId="z3" -Dversion=4.3.2 -Dpackaging=jar + mvn clean install -DskipTests mkdir -p $(APPPATH) cp $(JARPATH) $(APPPATH)/$(JARNAME) cp $(ICONPATH) $(APPPATH) From c201c87a9bc2a5c45c29a992f2e4049583a6f8af Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 15:20:03 +0100 Subject: [PATCH 030/145] Context re-initialize in every call to test --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e3a8cf71c6..fe14fe3cf7 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -101,9 +101,9 @@ public int getIconWidth() { private static GraphOption graph = new GraphOption(); private boolean isSat = false; private static Program pTarget; - private static Context ctx = new Context(); - private static Solver solver = ctx.mkSolver(); - private static Solver solver2 = ctx.mkSolver(); + private static Context ctx; + private static Solver solver; + private static Solver solver2; public Dat3M() { @@ -394,6 +394,10 @@ public void actionPerformed(ActionEvent e) { } } + ctx = new Context(); + solver = ctx.mkSolver(); + solver2 = ctx.mkSolver(); + String result = ""; switch(opt.getTask()){ case REACHABILITY: @@ -410,6 +414,7 @@ public void actionPerformed(ActionEvent e) { break; } consolePane.setText(result); + ctx.close(); } if(e.getActionCommand().equals("Clear")) { From 5f40b8f6c328d53ae1057a03ac18ca3476d44ea2 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Feb 2019 15:42:26 +0100 Subject: [PATCH 031/145] *.desktop only work for Linux. Makefile updated --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 3945cc4651..3002259f7e 100644 --- a/Makefile +++ b/Makefile @@ -3,13 +3,15 @@ JARPATH=./ui/target/ui-2.0.2-jar-with-dependencies.jar JARNAME=dat3m.jar ICONPATH=./ui/src/main/resources/dat3m.png -.PHONY: all install +.PHONY: all install linux -all: install +all: install linux install: mvn install:install-file -Dfile=lib/z3-4.3.2.jar -DgroupId=com.microsoft -DartifactId="z3" -Dversion=4.3.2 -Dpackaging=jar mvn clean install -DskipTests + +linux: mkdir -p $(APPPATH) cp $(JARPATH) $(APPPATH)/$(JARNAME) cp $(ICONPATH) $(APPPATH) @@ -18,6 +20,6 @@ install: echo 'Name=Dat3M' >> ./dat3m.desktop echo 'Comment=Dat3M' >> ./dat3m.desktop echo 'Terminal=false' >> ./dat3m.desktop - echo 'Exec=java -jar -Djava.library.path=./Dat3M/lib '$(APPPATH)/$(JARNAME) >> ./dat3m.desktop + echo 'Exec=java -jar -Djava.library.path='$(PWD)'/lib '$(APPPATH)/$(JARNAME) >> ./dat3m.desktop echo 'Icon='$(APPPATH)'/dat3m.png' >> ./dat3m.desktop chmod +x "./dat3m.desktop" From 5965dca01b5db2ea5270097dbf914f2ed3202820 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 10:26:52 +0100 Subject: [PATCH 032/145] Enabling execution button --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index fe14fe3cf7..6f66c56717 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -95,11 +95,11 @@ public int getIconWidth() { private static JSplitPane archPane; private static JPanel sArchPane; private static JPanel tArchPane; + private static JButton graphButton; private static Option opt = new Option(REACHABILITY, Arch.NONE, Arch.NONE, KNASTER, CFS, 1); // Execution witness private static GraphOption graph = new GraphOption(); - private boolean isSat = false; private static Program pTarget; private static Context ctx; private static Solver solver; @@ -180,9 +180,10 @@ public Dat3M() { clearButton.addActionListener(this); // Graph button. - JButton graphButton = new JButton("Execution Witness"); + graphButton = new JButton("Execution Witness"); graphButton.setMaximumSize(new Dimension(widht, 50)); graphButton.addActionListener(this); + graphButton.setEnabled(false); iconPane.setIcon(dartagnanIcon); @@ -403,8 +404,11 @@ public void actionPerformed(ActionEvent e) { case REACHABILITY: result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); - isSat = testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); + boolean isSat = testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); result += isSat ? "OK" : "No"; + if(canDrawGraph(pTarget.getAss(), isSat)) { + graphButton.setEnabled(true); + } break; case PORTABILITY: PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), @@ -421,10 +425,8 @@ public void actionPerformed(ActionEvent e) { consolePane.setText(""); } - if(e.getActionCommand().equals("Draw Execution Witness")) { - if(canDrawGraph(pTarget.getAss(), isSat)) { - graph.generate(solver, ctx, pTarget); - } + if(e.getActionCommand().equals("Execution Witness")) { + graph.generate(solver, ctx, pTarget); invokeLater(new Runnable() {public void run() {graph.open();}}); } } From ac7246139a93ea618508f2bb9d075bbccf9e9460 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 10:27:46 +0100 Subject: [PATCH 033/145] Makefile working for Linux --- Makefile | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 3002259f7e..8f0053d02a 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,5 @@ -APPPATH=$(HOME)/share/dat3m -JARPATH=./ui/target/ui-2.0.2-jar-with-dependencies.jar -JARNAME=dat3m.jar -ICONPATH=./ui/src/main/resources/dat3m.png +JARPATH=$(PWD)/ui/target/ui-2.0.2-jar-with-dependencies.jar +ICONPATH=$(PWD)/ui/src/main/resources/dat3m.png .PHONY: all install linux @@ -12,14 +10,6 @@ install: mvn clean install -DskipTests linux: - mkdir -p $(APPPATH) - cp $(JARPATH) $(APPPATH)/$(JARNAME) - cp $(ICONPATH) $(APPPATH) - echo '[Desktop Entry]' > ./dat3m.desktop - echo 'Type=Application' >> ./dat3m.desktop - echo 'Name=Dat3M' >> ./dat3m.desktop - echo 'Comment=Dat3M' >> ./dat3m.desktop - echo 'Terminal=false' >> ./dat3m.desktop - echo 'Exec=java -jar -Djava.library.path='$(PWD)'/lib '$(APPPATH)/$(JARNAME) >> ./dat3m.desktop - echo 'Icon='$(APPPATH)'/dat3m.png' >> ./dat3m.desktop + echo 'Exec=java -jar -Djava.library.path='$(PWD)'/lib '$(JARPATH) >> ./dat3m.desktop + echo 'Icon='$(ICONPATH) >> ./dat3m.desktop chmod +x "./dat3m.desktop" From 5a911325419234ab3dc489804031648afc5ebc36 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 10:42:24 +0100 Subject: [PATCH 034/145] Generate graph when testing since the context is needed and needs to be closed after testing --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 6f66c56717..e6889fe9fa 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -100,11 +100,7 @@ public int getIconWidth() { // Execution witness private static GraphOption graph = new GraphOption(); - private static Program pTarget; - private static Context ctx; - private static Solver solver; - private static Solver solver2; - + public Dat3M() { setLayout(new BorderLayout()); @@ -361,6 +357,7 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Test")) { Program pSource = null; + Program pTarget = null; Wmm smm = null; Wmm tmm = null; try { @@ -395,9 +392,9 @@ public void actionPerformed(ActionEvent e) { } } - ctx = new Context(); - solver = ctx.mkSolver(); - solver2 = ctx.mkSolver(); + Context ctx = new Context(); + Solver solver = ctx.mkSolver(); + Solver solver2 = ctx.mkSolver(); String result = ""; switch(opt.getTask()){ @@ -408,6 +405,7 @@ public void actionPerformed(ActionEvent e) { result += isSat ? "OK" : "No"; if(canDrawGraph(pTarget.getAss(), isSat)) { graphButton.setEnabled(true); + graph.generate(solver, ctx, pTarget); } break; case PORTABILITY: @@ -418,7 +416,7 @@ public void actionPerformed(ActionEvent e) { break; } consolePane.setText(result); - ctx.close(); + //ctx.close(); } if(e.getActionCommand().equals("Clear")) { @@ -426,7 +424,6 @@ public void actionPerformed(ActionEvent e) { } if(e.getActionCommand().equals("Execution Witness")) { - graph.generate(solver, ctx, pTarget); invokeLater(new Runnable() {public void run() {graph.open();}}); } } From d695a7ded23f56ad4e0077074452f78b3674368f Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 13:17:20 +0100 Subject: [PATCH 035/145] Correctly updates generated execution witness --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 +-- .../java/com/dat3m/ui/utils/GraphOption.java | 33 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e6889fe9fa..e4b3f42ec3 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -406,11 +406,12 @@ public void actionPerformed(ActionEvent e) { if(canDrawGraph(pTarget.getAss(), isSat)) { graphButton.setEnabled(true); graph.generate(solver, ctx, pTarget); + } else { + graphButton.setEnabled(false); } break; case PORTABILITY: - PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), - smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); + PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); String dummy = res.getIsPortable()? " " : " not "; result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); break; diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java index 3ed6036f56..a16316cac5 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java @@ -2,11 +2,15 @@ import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; +import static java.awt.Toolkit.getDefaultToolkit; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import javax.swing.ImageIcon; import javax.swing.JFrame; @@ -23,34 +27,35 @@ public class GraphOption { - static final String TMPDOTPATH = "./.tmp/output.dot"; - static final String TMPPNGPATH = "./.tmp/output.png"; + private String TMPDOTPATH = "./.tmp/output.dot"; + private String TMPPNGPATH = "./.tmp/output.png"; - public GraphOption() { - - } - public void generate(Solver solver, Context ctx, Program p) { Graph graph = new Graph(solver.getModel(), ctx); try { graph.build(p).draw(TMPDOTPATH); - File initialFile = new File(TMPDOTPATH); - InputStream targetStream = new FileInputStream(initialFile); + File dotFile = new File(TMPDOTPATH); + // The previous png file needs to be deleted + Path fileToDeletePath = Paths.get(TMPPNGPATH); + Files.delete(fileToDeletePath); + InputStream targetStream = new FileInputStream(dotFile); MutableGraph g = Parser.read(targetStream); fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); + dotFile.delete(); } catch (IOException e) { // This should never happen since the file is always created } } public void open() { - JFrame frame = new JFrame(); JLabel label = new JLabel(); - label.setIcon(new ImageIcon(TMPPNGPATH)); - JScrollPane scrool = new JScrollPane(label); - scrool.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scrool.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - frame.add(scrool); + // An image need to be created at every call since thet image changes + label.setIcon(new ImageIcon(getDefaultToolkit().createImage(TMPPNGPATH))); + JScrollPane scroll = new JScrollPane(label); + scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JFrame frame = new JFrame(); + frame.add(scroll); frame.pack(); frame.setVisible(true); } From bccfc4f83aa3dd6ce6cb37b6313191bbd229c034 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 22:03:08 +0100 Subject: [PATCH 036/145] icons --- ui/src/main/resources/aramis.jpg | Bin 0 -> 276478 bytes ui/src/main/resources/athos.jpg | Bin 0 -> 145664 bytes ui/src/main/resources/dartagnan.jpg | Bin 43451 -> 276769 bytes ui/src/main/resources/porthos.jpg | Bin 57842 -> 244764 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ui/src/main/resources/aramis.jpg create mode 100644 ui/src/main/resources/athos.jpg diff --git a/ui/src/main/resources/aramis.jpg b/ui/src/main/resources/aramis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..787338f005196c8e8e8c2ef906af0684554496f5 GIT binary patch literal 276478 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 !!MR`anL10IwYFjNLmBfKpF(?@s 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%0A$M_vv;= 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 literal 0 HcmV?d00001 diff --git a/ui/src/main/resources/dartagnan.jpg b/ui/src/main/resources/dartagnan.jpg index 17b019dc39b42525b4024e7502e81dc3baf7af83..4d37dc12034f552a1210e47c3dd490208ad2827b 100644 GIT binary patch literal 276769 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

|^$s8Tf1KNF>a{^zo>7_t()4$iaS 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 pqhN^0tv=$Cv!xD)e2DQuQw+#~Wmvj9 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 z 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 delta 41610 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 z zc8=bK#o8Y{{~Ff`#-yTv*3etytu&8D))`j=gU>hvWc2hK;;m|zQKa80osXsBo{Qkn zkKRIW0%a=1O(+&vIi3|G*@+7ji0{4iq>)347^-T|WX-)|b%N0Ra4$*>W_Ix-RLqkf zc=2f<$eo>FZNfxiH6<9Fm%#~IbYQxuF!4&5Y2(1CG{_Tu&9-u6B^1Xh9`-Xwg(fvh`Bb0$0fmp?Ary z7C@3>4G5%pecj^x3-PA~0H5KvjRiKkaK>CICqs8M(_e@q3e*RT$UCFKFXxegf`N;S zGnwHm<1fVT<}ajGae4Z@cL)W@lTJNZiAk&$TFe56XI-Q19l=H%=MD;p4VZWx_Il&H zCpdUQ{hxyLT-M%3&8p)Z6C9AS;+uVTos`PWsTC*ttE;Bq(M;?_b%k&sNUh>hToGl# z`pT76+or}Ta5N`iC3MFn^U*P`#W6K-T1;e(xEw2?Ex!Gph#)qv&0?u8_Lq0GiX0-L zaXcXC7jeIr!9t#BArpkXo?#RmP#`uGF{> w;fxP_tVo4PZO*)5fw}EEzq}`p-TTnc!NU|f2VIl-n3NL#`>8o5@OSpV0Q{7b6#xJL diff --git a/ui/src/main/resources/porthos.jpg b/ui/src/main/resources/porthos.jpg index d11af1369b71f01ba1088fdd3fcb5114190205ec..e04ed3801b88061fd0883e474cb86d6808ac903c 100644 GIT binary patch literal 244764 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%0AVY!AmYl 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 E0DEF4zW@LL From cb5fe241e1e1c4c7692cf8e4e3b707475143a617 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 23:05:14 +0100 Subject: [PATCH 037/145] Better display of jsplit panes --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 57 +++++++++++++------ .../java/com/dat3m/ui/utils/EditorUtils.java | 2 +- .../com/dat3m/ui/utils/ImporterMenuItem.java | 5 +- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e4b3f42ec3..da3cd28c84 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -33,6 +33,9 @@ import static com.dat3m.ui.utils.EditorUtils.parseMMEditor; import static com.dat3m.ui.utils.EditorUtils.parseProgramEditor; import static java.awt.FlowLayout.LEFT; +import static java.awt.FlowLayout.RIGHT; +import static java.lang.Math.max; +import static java.lang.Math.round; import static javax.swing.BorderFactory.createCompoundBorder; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.BorderFactory.createTitledBorder; @@ -107,8 +110,8 @@ public Dat3M() { JFileChooser chooser = new JFileChooser(); // Scales the figures - int newHeight = (int) Math.round((height / 3)); - int newWidth = dartagnanIcon.getIconWidth() * newHeight / dartagnanIcon.getIconHeight(); + int newWidth = max(300, (int) round((height / 3))); + int newHeight = dartagnanIcon.getIconHeight() * newWidth / dartagnanIcon.getIconWidth(); Image newDart = dartagnanIcon.getImage().getScaledInstance(newWidth, newHeight, 1); dartagnanIcon.setImage(newDart); Image newPort = porthosIcon.getImage().getScaledInstance(newWidth, newHeight, 1); @@ -117,12 +120,13 @@ public Dat3M() { ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); - pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor); + pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor, this); + pMenuItem.addActionListener(this); ArrayList mmExtensions = new ArrayList(); mmExtensions.add("cat"); - smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor); - tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor); + smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor, this); + tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor, this); menu.add(pMenuItem); // Initially only one MM can be loaded @@ -138,8 +142,11 @@ public Dat3M() { Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; tArchPane = createSelector(archs, "Target"); sArchPane = createSelector(archs, "Source"); + sArchPane.setLayout(new FlowLayout(RIGHT)); archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - archPane.setRightComponent(tArchPane); + archPane.add(tArchPane); + archPane.setPreferredSize(new Dimension(300, 0)); + archPane.setDividerSize(0); Mode[] modes = { KNASTER, IDL, KLEENE }; JPanel modePane = createSelector(modes, "Mode"); @@ -162,7 +169,7 @@ public Dat3M() { consolePane = new JTextPane(); consolePane.setEditable(false); JScrollPane scrollConsole = new JScrollPane(consolePane); - scrollConsole.setMinimumSize(new Dimension(0, 150)); + scrollConsole.setMinimumSize(new Dimension(0, 120)); scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); // Test button. @@ -185,14 +192,23 @@ public Dat3M() { //Put the options in a split pane. JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); + sp0.setDividerSize(2); JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); + sp1.setDividerSize(2); JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); + sp2.setDividerSize(2); JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); + sp3.setDividerSize(2); JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); + sp4.setDividerSize(2); JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); + sp5.setDividerSize(2); JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); + sp6.setDividerSize(2); JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); + sp7.setDividerSize(2); JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); + sp8.setDividerSize(2); JPanel optionsPane = new JPanel(new GridLayout(1,0)); TitledBorder titledBorder = createTitledBorder("Options"); titledBorder.setTitleJustification(CENTER); @@ -205,15 +221,14 @@ public Dat3M() { vSplitEditors.setBottomComponent(tmmScroll); vSplitEditors.setOneTouchExpandable(true); vSplitEditors.setDividerSize(2); - vSplitEditors.setDividerLocation(0.5); vSplitEditors.setPreferredSize(new Dimension(widht / 3, height / 3)); JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pScroll, vSplitEditors); hSplitEditors.setOneTouchExpandable(true); - hSplitEditors.setDividerLocation(0.4); hSplitEditors.setDividerSize(2); JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, hSplitEditors); + mainPane.setDividerSize(2); add(mainPane); } @@ -228,6 +243,17 @@ private JScrollPane createScroll(JEditorPane editor, String label) { return pScroll; } + private void updateTargetSource() { + archPane.remove(sArchPane); + archPane.remove(tArchPane); + if(!pMenuItem.getLoadedFormat().equals("litmus")) { + archPane.setLeftComponent(tArchPane); + if(opt.getTask().equals(PORTABILITY)) { + archPane.setRightComponent(sArchPane); + } + } + } + private void updateGUIonTask() { TitledBorder titledBorder = createTitledBorder(""); titledBorder.setTitleJustification(CENTER); @@ -242,10 +268,6 @@ private void updateGUIonTask() { // Update editor and menutItem labels titledBorder.setTitle(MMLABEL); menu.getItem(1).setText(MMLABEL); - // Remove source selection option - if(archPane.getLeftComponent() == sArchPane) { - archPane.remove(sArchPane); - } // Remove source memory model importer item if(menu.getItemCount() > 2 && menu.getItem(2) == smmMenuIte) { menu.remove(smmMenuIte); @@ -259,9 +281,6 @@ private void updateGUIonTask() { // Update editor and menutItem labels titledBorder.setTitle(TMMLABEL); menu.getItem(1).setText(TMMLABEL); - // Add source selection option - archPane.setLeftComponent(tArchPane); - // Add source memory model importer item menu.add(smmMenuIte); break; } @@ -427,6 +446,8 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Execution Witness")) { invokeLater(new Runnable() {public void run() {graph.open();}}); } + + updateTargetSource(); } class BoundListener implements KeyListener { @@ -462,7 +483,7 @@ public static int getMainScreenWidth() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); if (gs.length > 0) { - return (int) Math.round(gs[0].getDisplayMode().getWidth()); + return (int) round(gs[0].getDisplayMode().getWidth()); } return 0; } @@ -471,7 +492,7 @@ public static int getMainScreenHeight() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); if (gs.length > 0) { - return (int) Math.round(gs[0].getDisplayMode().getHeight()); + return (int) round(gs[0].getDisplayMode().getHeight()); } return 0; } diff --git a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java index 98471a2088..45910e24c4 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java @@ -15,7 +15,7 @@ public class EditorUtils { - static final String TMPPROGPATH = "./.tmp/program"; + static final String TMPPROGPATH = "./.tmp/program."; static final String TMPMMPATH = "./.tmp/mm.cat"; public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { diff --git a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java index a9b118b093..98daf8c455 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java +++ b/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java @@ -24,14 +24,15 @@ public class ImporterMenuItem extends JMenuItem { String loadedFormat = ""; - public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor) { + public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { super(label); chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); for(String ext : extensions) { chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); } - + + addActionListener(caller); addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ int r = chooser.showOpenDialog(null); From 1b6bd05e5cda56d00c1d37608fc3ed51f828f46d Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 1 Mar 2019 23:13:25 +0100 Subject: [PATCH 038/145] Added execution witness to porthos --- .../java/com/dat3m/porthos/PorthosResult.java | 4 ++-- ui/src/main/java/com/dat3m/ui/Dat3M.java | 6 ++++++ .../java/com/dat3m/ui/utils/GraphOption.java | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java b/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java index 38e2cab26d..2487c17e1f 100644 --- a/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java +++ b/porthos/src/main/java/com/dat3m/porthos/PorthosResult.java @@ -24,11 +24,11 @@ public int getIterations(){ return iterations; } - Program getSourceProgram(){ + public Program getSourceProgram(){ return sourceProgram; } - Program getTargetProgram(){ + public Program getTargetProgram(){ return targetProgram; } } diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index da3cd28c84..1b162a2d84 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -433,6 +433,12 @@ public void actionPerformed(ActionEvent e) { PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); String dummy = res.getIsPortable()? " " : " not "; result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); + if(!res.getIsPortable()) { + graphButton.setEnabled(true); + graph.generate(solver, ctx, res); + } else { + graphButton.setEnabled(false); + } break; } consolePane.setText(result); diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java index a16316cac5..3ce8ed9537 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java @@ -19,6 +19,7 @@ import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.utils.Graph; +import com.dat3m.porthos.PorthosResult; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; @@ -47,6 +48,23 @@ public void generate(Solver solver, Context ctx, Program p) { } } + public void generate(Solver solver, Context ctx, PorthosResult results) { + Graph graph = new Graph(solver.getModel(), ctx); + try { + graph.build(results.getSourceProgram(), results.getTargetProgram()).draw(TMPDOTPATH); + File dotFile = new File(TMPDOTPATH); + // The previous png file needs to be deleted + Path fileToDeletePath = Paths.get(TMPPNGPATH); + Files.delete(fileToDeletePath); + InputStream targetStream = new FileInputStream(dotFile); + MutableGraph g = Parser.read(targetStream); + fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); + dotFile.delete(); + } catch (IOException e) { + // This should never happen since the file is always created + } + } + public void open() { JLabel label = new JLabel(); // An image need to be created at every call since thet image changes From 635ad468a9a6be9855ab5607511f192573506593 Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 2 Mar 2019 09:55:41 +0100 Subject: [PATCH 039/145] Some re-factoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 97 +++++++++---------- .../main/java/com/dat3m/ui/utils/Option.java | 2 +- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 1b162a2d84..9367049601 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -36,12 +36,12 @@ import static java.awt.FlowLayout.RIGHT; import static java.lang.Math.max; import static java.lang.Math.round; -import static javax.swing.BorderFactory.createCompoundBorder; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.JOptionPane.INFORMATION_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog; import static javax.swing.SwingUtilities.invokeLater; +import static javax.swing.UIManager.getDefaults; import static javax.swing.border.TitledBorder.CENTER; import java.awt.*; @@ -50,15 +50,14 @@ public class Dat3M extends JPanel implements ActionListener { - private static final String PROGRAMLABEL = "Program"; - private static final String MMLABEL = "Memory Model"; - private static final String SMMLABEL = "Source Memory Model"; - private static final String TMMLABEL = "Target Memory Model"; + public static final String PROGRAMLABEL = "Program"; + public static final String MMLABEL = "Memory Model"; + public static final String SMMLABEL = "Source Memory Model"; + public static final String TMMLABEL = "Target Memory Model"; - private static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); - private static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); + public static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - // Used in ImporterMenuItem public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -220,12 +219,15 @@ public Dat3M() { vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); vSplitEditors.setBottomComponent(tmmScroll); vSplitEditors.setOneTouchExpandable(true); - vSplitEditors.setDividerSize(2); + vSplitEditors.setDividerSize(0); vSplitEditors.setPreferredSize(new Dimension(widht / 3, height / 3)); + vSplitEditors.setBorder(new TitledBorder("")); JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pScroll, vSplitEditors); hSplitEditors.setOneTouchExpandable(true); hSplitEditors.setDividerSize(2); + hSplitEditors.setBorder(new TitledBorder("")); + JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, hSplitEditors); mainPane.setDividerSize(2); @@ -237,9 +239,9 @@ private JScrollPane createScroll(JEditorPane editor, String label) { pScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); pScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); pScroll.setPreferredSize(new Dimension(widht / 3, height / 3)); - TitledBorder pTitledBorder = createTitledBorder(label); - pTitledBorder.setTitleJustification(CENTER); - pScroll.setBorder(createCompoundBorder(pTitledBorder, createEmptyBorder(5,5,5,5))); + TitledBorder border = createTitledBorder(label); + border.setTitleJustification(CENTER); + pScroll.setBorder(border); return pScroll; } @@ -254,41 +256,6 @@ private void updateTargetSource() { } } - private void updateGUIonTask() { - TitledBorder titledBorder = createTitledBorder(""); - titledBorder.setTitleJustification(CENTER); - switch(opt.getTask()){ - case REACHABILITY: - // Update image - iconPane.setIcon(dartagnanIcon); - // Remove smmEditor - if(vSplitEditors.getTopComponent() == smmScroll) { - vSplitEditors.remove(smmScroll); - } - // Update editor and menutItem labels - titledBorder.setTitle(MMLABEL); - menu.getItem(1).setText(MMLABEL); - // Remove source memory model importer item - if(menu.getItemCount() > 2 && menu.getItem(2) == smmMenuIte) { - menu.remove(smmMenuIte); - } - break; - case PORTABILITY: - // Update image - iconPane.setIcon(porthosIcon); - // Add smmEditor - vSplitEditors.setTopComponent(smmScroll); - // Update editor and menutItem labels - titledBorder.setTitle(TMMLABEL); - menu.getItem(1).setText(TMMLABEL); - menu.add(smmMenuIte); - break; - } - // The console is cleaned when the task is changed - consolePane.setText(""); - tmmScroll.setBorder(createCompoundBorder(titledBorder, createEmptyBorder(5,5,5,5))); - } - private JPanel createSelector(Object[] options, String label) { JComboBox selector = new JComboBox(options); selector.setActionCommand(label); @@ -325,7 +292,7 @@ private static void createAndShowGUI() { } public static void main(String[] args) { - UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); + getDefaults().put("SplitPane.border", createEmptyBorder()); invokeLater(new Runnable() {public void run() {createAndShowGUI();}}); } @@ -341,8 +308,38 @@ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Task")) { Object source = e.getSource(); if(source instanceof JComboBox) { - opt.setTak((Task) ((JComboBox)source).getSelectedItem()); - updateGUIonTask(); + opt.setTask((Task) ((JComboBox)source).getSelectedItem()); + TitledBorder border = (TitledBorder) tmmScroll.getBorder(); + switch(opt.getTask()){ + case REACHABILITY: + // Update image + iconPane.setIcon(dartagnanIcon); + // Remove smmEditor + if(vSplitEditors.getTopComponent() == smmScroll) { + vSplitEditors.remove(smmScroll); + } + // Update editor and menutItem labels + border.setTitle(MMLABEL); + menu.getItem(1).setText(MMLABEL); + // Remove source memory model importer item + if(menu.getItemCount() > 2 && menu.getItem(2) == smmMenuIte) { + menu.remove(smmMenuIte); + } + break; + case PORTABILITY: + // Update image + iconPane.setIcon(porthosIcon); + // Add smmEditor + vSplitEditors.setTopComponent(smmScroll); + // Update editor and menutItem labels + border.setTitle(TMMLABEL); + menu.getItem(1).setText(TMMLABEL); + menu.add(smmMenuIte); + break; + } + // The console is cleaned when the task is changed + consolePane.setText(""); + tmmScroll.setBorder(border); } } diff --git a/ui/src/main/java/com/dat3m/ui/utils/Option.java b/ui/src/main/java/com/dat3m/ui/utils/Option.java index ebf29024df..87d3737b3c 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Option.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Option.java @@ -27,7 +27,7 @@ public Task getTask() { return task; } - public void setTak(Task task) { + public void setTask(Task task) { this.task = task; } From 56ff87126c7b9d725edb01d9dcdc174d369d4d9a Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 2 Mar 2019 10:20:36 +0100 Subject: [PATCH 040/145] Enabling / disabling task selector --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 50 +++++++------------ .../com/dat3m/ui/utils/EnabledSelector.java | 30 +++++++++++ 2 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 9367049601..a0aff6b02f 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,6 +10,7 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.utils.EnabledSelector; import com.dat3m.ui.utils.GraphOption; import com.dat3m.ui.utils.ImporterMenuItem; import com.dat3m.ui.utils.Option; @@ -94,7 +95,6 @@ public int getIconWidth() { // Options pane private static JTextPane consolePane; private static JTextField boundField; - private static JSplitPane archPane; private static JPanel sArchPane; private static JPanel tArchPane; private static JButton graphButton; @@ -136,22 +136,24 @@ public Dat3M() { tmmScroll = createScroll(tmmEditor, MMLABEL); Task[] tasks = { REACHABILITY, PORTABILITY }; - JPanel taskPane = createSelector(tasks, "Task"); + JPanel taskPane = new EnabledSelector(tasks, "Task", this); Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; - tArchPane = createSelector(archs, "Target"); - sArchPane = createSelector(archs, "Source"); + tArchPane = new EnabledSelector(archs, "Target", this); + sArchPane = new EnabledSelector(archs, "Source", this); sArchPane.setLayout(new FlowLayout(RIGHT)); - archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - archPane.add(tArchPane); + JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + archPane.setLeftComponent(tArchPane); + archPane.setRightComponent(sArchPane); + sArchPane.setEnabled(false); archPane.setPreferredSize(new Dimension(300, 0)); archPane.setDividerSize(0); Mode[] modes = { KNASTER, IDL, KLEENE }; - JPanel modePane = createSelector(modes, "Mode"); + JPanel modePane = new EnabledSelector(modes, "Mode", this); Alias[] aliases = { CFS, Alias.NONE, CFIS }; - JPanel aliasPane = createSelector(aliases, "Alias"); + JPanel aliasPane = new EnabledSelector(aliases, "Alias", this); // Bound editor boundField = new JTextField(3); @@ -245,28 +247,6 @@ private JScrollPane createScroll(JEditorPane editor, String label) { return pScroll; } - private void updateTargetSource() { - archPane.remove(sArchPane); - archPane.remove(tArchPane); - if(!pMenuItem.getLoadedFormat().equals("litmus")) { - archPane.setLeftComponent(tArchPane); - if(opt.getTask().equals(PORTABILITY)) { - archPane.setRightComponent(sArchPane); - } - } - } - - private JPanel createSelector(Object[] options, String label) { - JComboBox selector = new JComboBox(options); - selector.setActionCommand(label); - selector.addActionListener(this); - JLabel sLabel = new JLabel(label + ": "); - JPanel pane = new JPanel(new FlowLayout(LEFT)); - pane.add(sLabel); - pane.add(selector); - return pane; - } - /** * Create the GUI and show it. For thread safety, * this method should be invoked from the @@ -450,7 +430,15 @@ public void actionPerformed(ActionEvent e) { invokeLater(new Runnable() {public void run() {graph.open();}}); } - updateTargetSource(); + // We update the task selectors + tArchPane.setEnabled(false); + sArchPane.setEnabled(false); + if(!pMenuItem.getLoadedFormat().equals("litmus")) { + tArchPane.setEnabled(true); + if(opt.getTask().equals(PORTABILITY)) { + sArchPane.setEnabled(true); + } + } } class BoundListener implements KeyListener { diff --git a/ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java b/ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java new file mode 100644 index 0000000000..6f80911748 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java @@ -0,0 +1,30 @@ +package com.dat3m.ui.utils; + +import static java.awt.FlowLayout.LEFT; + +import java.awt.FlowLayout; +import java.awt.event.ActionListener; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; + +public class EnabledSelector extends JPanel { + + private JComboBox selector; + + public EnabledSelector(Object[] options, String label, ActionListener caller) { + selector = new JComboBox(options); + selector.setActionCommand(label); + selector.addActionListener(caller); + JLabel sLabel = new JLabel(label + ": "); + this.setLayout(new FlowLayout(LEFT)); + this.add(sLabel); + this.add(selector); + } + + @Override + public void setEnabled(boolean b) { + selector.setEnabled(b); + } +} From a6114f5cee757e6ea7a414275264b1cd24a75529 Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 2 Mar 2019 10:29:17 +0100 Subject: [PATCH 041/145] Structure re-factoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 28 +++++++++---------- .../ui/{utils => option}/GraphOption.java | 0 .../dat3m/ui/{utils => option}/Option.java | 0 .../{EnabledSelector.java => Selector.java} | 6 ++-- .../ui/utils/{EditorUtils.java => Utils.java} | 2 +- .../ui/menu/MenuItem.java} | 6 ++-- 6 files changed, 20 insertions(+), 22 deletions(-) rename ui/src/main/java/com/dat3m/ui/{utils => option}/GraphOption.java (100%) rename ui/src/main/java/com/dat3m/ui/{utils => option}/Option.java (100%) rename ui/src/main/java/com/dat3m/ui/utils/{EnabledSelector.java => Selector.java} (78%) rename ui/src/main/java/com/dat3m/ui/utils/{EditorUtils.java => Utils.java} (98%) rename ui/src/main/java/com/{dat3m/ui/utils/ImporterMenuItem.java => datem/ui/menu/MenuItem.java} (89%) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a0aff6b02f..f46313b7b7 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,9 +10,7 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; -import com.dat3m.ui.utils.EnabledSelector; import com.dat3m.ui.utils.GraphOption; -import com.dat3m.ui.utils.ImporterMenuItem; import com.dat3m.ui.utils.Option; import com.dat3m.ui.utils.Task; import com.microsoft.z3.Context; @@ -31,8 +29,8 @@ import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; import static com.dat3m.ui.utils.Task.PORTABILITY; import static com.dat3m.ui.utils.Task.REACHABILITY; -import static com.dat3m.ui.utils.EditorUtils.parseMMEditor; -import static com.dat3m.ui.utils.EditorUtils.parseProgramEditor; +import static com.dat3m.ui.utils.Utils.parseMMEditor; +import static com.dat3m.ui.utils.Utils.parseProgramEditor; import static java.awt.FlowLayout.LEFT; import static java.awt.FlowLayout.RIGHT; import static java.lang.Math.max; @@ -84,14 +82,14 @@ public int getIconWidth() { private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); // Editors and Menu Items private static JEditorPane pEditor = new JEditorPane(); - private static ImporterMenuItem pMenuItem; + private static MenuItem pMenuItem; private static JSplitPane vSplitEditors; private static JScrollPane smmScroll; private static JEditorPane smmEditor = new JEditorPane(); - private static ImporterMenuItem smmMenuIte; + private static MenuItem smmMenuIte; private static JScrollPane tmmScroll; private static JEditorPane tmmEditor = new JEditorPane(); - private static ImporterMenuItem tmmMenuIte; + private static MenuItem tmmMenuIte; // Options pane private static JTextPane consolePane; private static JTextField boundField; @@ -119,13 +117,13 @@ public Dat3M() { ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); - pMenuItem = new ImporterMenuItem("Program", chooser, pExtensions, pEditor, this); + pMenuItem = new MenuItem("Program", chooser, pExtensions, pEditor, this); pMenuItem.addActionListener(this); ArrayList mmExtensions = new ArrayList(); mmExtensions.add("cat"); - smmMenuIte = new ImporterMenuItem(SMMLABEL, chooser, mmExtensions, smmEditor, this); - tmmMenuIte = new ImporterMenuItem(MMLABEL, chooser, mmExtensions, tmmEditor, this); + smmMenuIte = new MenuItem(SMMLABEL, chooser, mmExtensions, smmEditor, this); + tmmMenuIte = new MenuItem(MMLABEL, chooser, mmExtensions, tmmEditor, this); menu.add(pMenuItem); // Initially only one MM can be loaded @@ -136,11 +134,11 @@ public Dat3M() { tmmScroll = createScroll(tmmEditor, MMLABEL); Task[] tasks = { REACHABILITY, PORTABILITY }; - JPanel taskPane = new EnabledSelector(tasks, "Task", this); + JPanel taskPane = new Selector(tasks, "Task", this); Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; - tArchPane = new EnabledSelector(archs, "Target", this); - sArchPane = new EnabledSelector(archs, "Source", this); + tArchPane = new Selector(archs, "Target", this); + sArchPane = new Selector(archs, "Source", this); sArchPane.setLayout(new FlowLayout(RIGHT)); JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); archPane.setLeftComponent(tArchPane); @@ -150,10 +148,10 @@ public Dat3M() { archPane.setDividerSize(0); Mode[] modes = { KNASTER, IDL, KLEENE }; - JPanel modePane = new EnabledSelector(modes, "Mode", this); + JPanel modePane = new Selector(modes, "Mode", this); Alias[] aliases = { CFS, Alias.NONE, CFIS }; - JPanel aliasPane = new EnabledSelector(aliases, "Alias", this); + JPanel aliasPane = new Selector(aliases, "Alias", this); // Bound editor boundField = new JTextField(3); diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphOption.java b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java similarity index 100% rename from ui/src/main/java/com/dat3m/ui/utils/GraphOption.java rename to ui/src/main/java/com/dat3m/ui/option/GraphOption.java diff --git a/ui/src/main/java/com/dat3m/ui/utils/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java similarity index 100% rename from ui/src/main/java/com/dat3m/ui/utils/Option.java rename to ui/src/main/java/com/dat3m/ui/option/Option.java diff --git a/ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java similarity index 78% rename from ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java rename to ui/src/main/java/com/dat3m/ui/utils/Selector.java index 6f80911748..db67f322c3 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/EnabledSelector.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Selector.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.utils; +package com.dat3m.ui; import static java.awt.FlowLayout.LEFT; @@ -9,11 +9,11 @@ import javax.swing.JLabel; import javax.swing.JPanel; -public class EnabledSelector extends JPanel { +public class Selector extends JPanel { private JComboBox selector; - public EnabledSelector(Object[] options, String label, ActionListener caller) { + public Selector(Object[] options, String label, ActionListener caller) { selector = new JComboBox(options); selector.setActionCommand(label); selector.addActionListener(caller); diff --git a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java similarity index 98% rename from ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java rename to ui/src/main/java/com/dat3m/ui/utils/Utils.java index 45910e24c4..b73c0bf38e 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/EditorUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -13,7 +13,7 @@ import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; -public class EditorUtils { +public class Utils { static final String TMPPROGPATH = "./.tmp/program."; static final String TMPMMPATH = "./.tmp/mm.cat"; diff --git a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java b/ui/src/main/java/com/datem/ui/menu/MenuItem.java similarity index 89% rename from ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java rename to ui/src/main/java/com/datem/ui/menu/MenuItem.java index 98daf8c455..7dd05f54cf 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/ImporterMenuItem.java +++ b/ui/src/main/java/com/datem/ui/menu/MenuItem.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.utils; +package com.dat3m.ui; import static com.dat3m.ui.Dat3M.dat3mIcon; import static java.lang.System.getProperty; @@ -20,11 +20,11 @@ import javax.swing.JMenuItem; import javax.swing.filechooser.FileNameExtensionFilter; -public class ImporterMenuItem extends JMenuItem { +public class MenuItem extends JMenuItem { String loadedFormat = ""; - public ImporterMenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { + public MenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { super(label); chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); From 8eef8671da7cf8812fe26c6927b20bc12158041c Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 2 Mar 2019 10:29:33 +0100 Subject: [PATCH 042/145] Structure re-factoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 6 ++++-- ui/src/main/java/com/dat3m/ui/option/GraphOption.java | 2 +- ui/src/main/java/com/dat3m/ui/option/Option.java | 3 ++- ui/src/main/java/com/dat3m/ui/utils/Selector.java | 2 +- ui/src/main/java/com/datem/ui/menu/MenuItem.java | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index f46313b7b7..d492c6d531 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,9 +10,11 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; -import com.dat3m.ui.utils.GraphOption; -import com.dat3m.ui.utils.Option; +import com.dat3m.ui.option.GraphOption; +import com.dat3m.ui.option.Option; +import com.dat3m.ui.utils.Selector; import com.dat3m.ui.utils.Task; +import com.datem.ui.menu.MenuItem; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; diff --git a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java index 3ce8ed9537..e4b2e47eed 100644 --- a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.utils; +package com.dat3m.ui.option; import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java index 87d3737b3c..6d381d0575 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/option/Option.java @@ -1,8 +1,9 @@ -package com.dat3m.ui.utils; +package com.dat3m.ui.option; import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.ui.utils.Task; public class Option { diff --git a/ui/src/main/java/com/dat3m/ui/utils/Selector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java index db67f322c3..0274a7ce6a 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Selector.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Selector.java @@ -1,4 +1,4 @@ -package com.dat3m.ui; +package com.dat3m.ui.utils; import static java.awt.FlowLayout.LEFT; diff --git a/ui/src/main/java/com/datem/ui/menu/MenuItem.java b/ui/src/main/java/com/datem/ui/menu/MenuItem.java index 7dd05f54cf..960823390e 100644 --- a/ui/src/main/java/com/datem/ui/menu/MenuItem.java +++ b/ui/src/main/java/com/datem/ui/menu/MenuItem.java @@ -1,4 +1,4 @@ -package com.dat3m.ui; +package com.datem.ui.menu; import static com.dat3m.ui.Dat3M.dat3mIcon; import static java.lang.System.getProperty; From 30862274eb43e6ffb73ce789c3d1240f26f66827 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 4 Mar 2019 16:40:42 +0100 Subject: [PATCH 043/145] Code re-factoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 62 ++++++------------- .../main/java/com/dat3m/ui/utils/Utils.java | 22 +++++++ 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index d492c6d531..54a8f7844b 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -31,6 +31,8 @@ import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; import static com.dat3m.ui.utils.Task.PORTABILITY; import static com.dat3m.ui.utils.Task.REACHABILITY; +import static com.dat3m.ui.utils.Utils.getMainScreenHeight; +import static com.dat3m.ui.utils.Utils.getMainScreenWidth; import static com.dat3m.ui.utils.Utils.parseMMEditor; import static com.dat3m.ui.utils.Utils.parseProgramEditor; import static java.awt.FlowLayout.LEFT; @@ -247,33 +249,25 @@ private JScrollPane createScroll(JEditorPane editor, String label) { return pScroll; } - /** - * Create the GUI and show it. For thread safety, - * this method should be invoked from the - * event dispatch thread. - */ - private static void createAndShowGUI() { - //Create and set up the window. - JFrame frame = new JFrame("Dat3M"); - frame.setExtendedState(JFrame.MAXIMIZED_BOTH); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(menu); - frame.setJMenuBar(menuBar); - frame.setIconImage(dat3mIcon.getImage()); - - //Add content to the window. - frame.add(new Dat3M()); - - //Display the window. - frame.pack(); - frame.setVisible(true); - } - public static void main(String[] args) { getDefaults().put("SplitPane.border", createEmptyBorder()); - invokeLater(new Runnable() {public void run() {createAndShowGUI();}}); + invokeLater(new Runnable() {public void run() { + JFrame frame = new JFrame("Dat3M"); + frame.setExtendedState(JFrame.MAXIMIZED_BOTH); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JMenuBar menuBar = new JMenuBar(); + menuBar.add(menu); + frame.setJMenuBar(menuBar); + frame.setIconImage(dat3mIcon.getImage()); + + //Add content to the window. + frame.add(new Dat3M()); + + //Display the window. + frame.pack(); + frame.setVisible(true); + ;}}); } @SuppressWarnings("unchecked") @@ -469,22 +463,4 @@ public void keyReleased(KeyEvent arg0) { } } }; - - public static int getMainScreenWidth() { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice[] gs = ge.getScreenDevices(); - if (gs.length > 0) { - return (int) round(gs[0].getDisplayMode().getWidth()); - } - return 0; - } - - public static int getMainScreenHeight() { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice[] gs = ge.getScreenDevices(); - if (gs.length > 0) { - return (int) round(gs[0].getDisplayMode().getHeight()); - } - return 0; - } } diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index b73c0bf38e..005a4cf49a 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -1,5 +1,9 @@ package com.dat3m.ui.utils; +import static java.lang.Math.round; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -47,4 +51,22 @@ private static File createTmpFile(JEditorPane editor, String path) writer.close(); return tmpProgramFile; } + + public static int getMainScreenWidth() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + if (gs.length > 0) { + return (int) round(gs[0].getDisplayMode().getWidth()); + } + return 0; + } + + public static int getMainScreenHeight() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + if (gs.length > 0) { + return (int) round(gs[0].getDisplayMode().getHeight()); + } + return 0; + } } From a84d0d6e92d6ca7f82915e08bcc7617e4a5f3539 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 5 Mar 2019 13:49:58 +0100 Subject: [PATCH 044/145] Removed Target label when the graph is for Dartagnan --- dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java index e5fbe7e8ba..767e704286 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java @@ -62,7 +62,7 @@ public void addRelations(Collection relations){ public Graph build(Program program){ buffer = new StringBuilder(); buffer.append("digraph G {\n") - .append(L1).append("subgraph cluster_Target { ").append(getProgramDef(targetLabel)).append("\n") + .append(L1).append("subgraph cluster_Target { ").append("\n") .append(buildProgramGraph(program)) .append(L1).append("}\n") .append("}\n"); From bb3abf9865c0e84401fbd029bdf29e4c1af14b9c Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 5 Mar 2019 14:44:17 +0100 Subject: [PATCH 045/145] Improvement in the code --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 68 +++++++++++++------ .../java/com/dat3m/ui/option/GraphOption.java | 4 +- .../main/java/com/dat3m/ui/option/Option.java | 36 +++++----- .../java/com/dat3m/ui/utils/Selector.java | 2 +- .../main/java/com/dat3m/ui/utils/Utils.java | 4 +- .../main/java/com/datem/ui/menu/MenuItem.java | 3 +- 6 files changed, 73 insertions(+), 44 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 54a8f7844b..1acc155c03 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -58,9 +58,50 @@ public class Dat3M extends JPanel implements ActionListener { public static final String SMMLABEL = "Source Memory Model"; public static final String TMMLABEL = "Target Memory Model"; - public static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); - public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - + private static final int width = getMainScreenWidth(); + private static final int height = getMainScreenHeight(); + + // These two are not final since they can be scaled + public static final ImageIcon dartagnanOriginal = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + public static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan") { + @Override + public void paintIcon( Component c, Graphics g, int x, int y ) { + g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); + } + + @Override + public int getIconHeight() { + return dartagnanOriginal.getIconHeight() * newWidth / dartagnanOriginal.getIconWidth(); + } + + @Override + public int getIconWidth() { + return newWidth; + } + + private int newWidth = max(300, (int) round((height / 3))); + }; + + public static final ImageIcon porthosOriginal = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); + public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan") { + @Override + public void paintIcon( Component c, Graphics g, int x, int y ) { + g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); + } + + @Override + public int getIconHeight() { + return porthosOriginal.getIconHeight() * newWidth / porthosOriginal.getIconWidth(); + } + + @Override + public int getIconWidth() { + return newWidth; + } + + private int newWidth = max(300, (int) round((height / 3))); +}; + public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -78,9 +119,6 @@ public int getIconWidth() { } }; - private static final int widht = getMainScreenWidth(); - private static final int height = getMainScreenHeight(); - // All these panes are fields since they need to be updated by the listener private static JMenu menu = new JMenu("Import"); private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); @@ -110,14 +148,6 @@ public Dat3M() { setLayout(new BorderLayout()); JFileChooser chooser = new JFileChooser(); - // Scales the figures - int newWidth = max(300, (int) round((height / 3))); - int newHeight = dartagnanIcon.getIconHeight() * newWidth / dartagnanIcon.getIconWidth(); - Image newDart = dartagnanIcon.getImage().getScaledInstance(newWidth, newHeight, 1); - dartagnanIcon.setImage(newDart); - Image newPort = porthosIcon.getImage().getScaledInstance(newWidth, newHeight, 1); - porthosIcon.setImage(newPort); - ArrayList pExtensions = new ArrayList(); pExtensions.add("litmus"); pExtensions.add("pts"); @@ -177,17 +207,17 @@ public Dat3M() { // Test button. JButton testButton = new JButton("Test"); - testButton.setMaximumSize(new Dimension(widht, 50)); + testButton.setMaximumSize(new Dimension(width, 50)); testButton.addActionListener(this); // Clear button. JButton clearButton = new JButton("Clear"); - clearButton.setMaximumSize(new Dimension(widht, 50)); + clearButton.setMaximumSize(new Dimension(width, 50)); clearButton.addActionListener(this); // Graph button. graphButton = new JButton("Execution Witness"); - graphButton.setMaximumSize(new Dimension(widht, 50)); + graphButton.setMaximumSize(new Dimension(width, 50)); graphButton.addActionListener(this); graphButton.setEnabled(false); @@ -224,7 +254,7 @@ public Dat3M() { vSplitEditors.setBottomComponent(tmmScroll); vSplitEditors.setOneTouchExpandable(true); vSplitEditors.setDividerSize(0); - vSplitEditors.setPreferredSize(new Dimension(widht / 3, height / 3)); + vSplitEditors.setPreferredSize(new Dimension(width / 3, height / 3)); vSplitEditors.setBorder(new TitledBorder("")); JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pScroll, vSplitEditors); @@ -242,7 +272,7 @@ private JScrollPane createScroll(JEditorPane editor, String label) { JScrollPane pScroll = new JScrollPane(editor); pScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); pScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - pScroll.setPreferredSize(new Dimension(widht / 3, height / 3)); + pScroll.setPreferredSize(new Dimension(width / 3, height / 3)); TitledBorder border = createTitledBorder(label); border.setTitleJustification(CENTER); pScroll.setBorder(border); diff --git a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java index e4b2e47eed..1921bc4832 100644 --- a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java @@ -28,8 +28,8 @@ public class GraphOption { - private String TMPDOTPATH = "./.tmp/output.dot"; - private String TMPPNGPATH = "./.tmp/output.png"; + private final String TMPDOTPATH = "./.tmp/output.dot"; + private final String TMPPNGPATH = "./.tmp/output.png"; public void generate(Solver solver, Context ctx, Program p) { Graph graph = new Graph(solver.getModel(), ctx); diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java index 6d381d0575..f9e2c58e0e 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/option/Option.java @@ -8,20 +8,20 @@ public class Option { // All these are fields since they need to be updated by the listener - private Task task = Task.REACHABILITY; - private Arch target = Arch.NONE; - private Arch source = Arch.NONE; - private Mode mode = Mode.KNASTER; - private Alias alias = Alias.CFS; - private int bound = 1; + private static Task task = Task.REACHABILITY; + private static Arch target = Arch.NONE; + private static Arch source = Arch.NONE; + private static Mode mode = Mode.KNASTER; + private static Alias alias = Alias.CFS; + private static int bound = 1; public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { - this.task = task; - this.target = target; - this.source = source; - this.mode = mode; - this.alias = alias; - this.bound = bound; + Option.task = task; + Option.target = target; + Option.source = source; + Option.mode = mode; + Option.alias = alias; + Option.bound = bound; } public Task getTask() { @@ -29,7 +29,7 @@ public Task getTask() { } public void setTask(Task task) { - this.task = task; + Option.task = task; } public Arch getTarget() { @@ -37,7 +37,7 @@ public Arch getTarget() { } public void setTarget(Arch target) { - this.target = target; + Option.target = target; } public Arch getSource() { @@ -45,7 +45,7 @@ public Arch getSource() { } public void setSource(Arch source) { - this.source = source; + Option.source = source; } public Mode getMode() { @@ -53,7 +53,7 @@ public Mode getMode() { } public void setMode(Mode mode) { - this.mode = mode; + Option.mode = mode; } public Alias getAlias() { @@ -61,7 +61,7 @@ public Alias getAlias() { } public void setAlias(Alias alias) { - this.alias = alias; + Option.alias = alias; } public int getBound() { @@ -69,6 +69,6 @@ public int getBound() { } public void setBound(int bound) { - this.bound = bound; + Option.bound = bound; } } diff --git a/ui/src/main/java/com/dat3m/ui/utils/Selector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java index 0274a7ce6a..83eb1cba3c 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Selector.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Selector.java @@ -11,7 +11,7 @@ public class Selector extends JPanel { - private JComboBox selector; + private static JComboBox selector; public Selector(Object[] options, String label, ActionListener caller) { selector = new JComboBox(options); diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 005a4cf49a..29f125d56c 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -19,8 +19,8 @@ public class Utils { - static final String TMPPROGPATH = "./.tmp/program."; - static final String TMPMMPATH = "./.tmp/mm.cat"; + private static final String TMPPROGPATH = "./.tmp/program."; + private static final String TMPMMPATH = "./.tmp/mm.cat"; public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { String path = TMPPROGPATH + loadedFormat; diff --git a/ui/src/main/java/com/datem/ui/menu/MenuItem.java b/ui/src/main/java/com/datem/ui/menu/MenuItem.java index 960823390e..f04f8dace7 100644 --- a/ui/src/main/java/com/datem/ui/menu/MenuItem.java +++ b/ui/src/main/java/com/datem/ui/menu/MenuItem.java @@ -22,7 +22,7 @@ public class MenuItem extends JMenuItem { - String loadedFormat = ""; + private static String loadedFormat = ""; public MenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { super(label); @@ -57,5 +57,4 @@ public void actionPerformed(ActionEvent event){ public String getLoadedFormat() { return loadedFormat; } - } From a8df370b27d99fd7d6de01caa05c946922009374 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 5 Mar 2019 15:00:48 +0100 Subject: [PATCH 046/145] Fixed some problems due to use static fields --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 7 ++++--- ui/src/main/java/com/dat3m/ui/utils/Selector.java | 2 +- ui/src/main/java/com/datem/ui/menu/MenuItem.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 1acc155c03..24aae7b6a6 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -83,7 +83,7 @@ public int getIconWidth() { }; public static final ImageIcon porthosOriginal = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan") { + public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); @@ -376,6 +376,8 @@ public void actionPerformed(ActionEvent e) { } if(e.getActionCommand().equals("Test")) { + String result = ""; + consolePane.setText(result); Program pSource = null; Program pTarget = null; Wmm smm = null; @@ -416,7 +418,6 @@ public void actionPerformed(ActionEvent e) { Solver solver = ctx.mkSolver(); Solver solver2 = ctx.mkSolver(); - String result = ""; switch(opt.getTask()){ case REACHABILITY: result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; @@ -443,7 +444,7 @@ public void actionPerformed(ActionEvent e) { break; } consolePane.setText(result); - //ctx.close(); + ctx.close(); } if(e.getActionCommand().equals("Clear")) { diff --git a/ui/src/main/java/com/dat3m/ui/utils/Selector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java index 83eb1cba3c..0274a7ce6a 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Selector.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Selector.java @@ -11,7 +11,7 @@ public class Selector extends JPanel { - private static JComboBox selector; + private JComboBox selector; public Selector(Object[] options, String label, ActionListener caller) { selector = new JComboBox(options); diff --git a/ui/src/main/java/com/datem/ui/menu/MenuItem.java b/ui/src/main/java/com/datem/ui/menu/MenuItem.java index f04f8dace7..bcd95c8805 100644 --- a/ui/src/main/java/com/datem/ui/menu/MenuItem.java +++ b/ui/src/main/java/com/datem/ui/menu/MenuItem.java @@ -22,7 +22,7 @@ public class MenuItem extends JMenuItem { - private static String loadedFormat = ""; + private String loadedFormat = ""; public MenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { super(label); From e11f676361ccae9a42334236a69c1f2bd07eb882 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 6 Mar 2019 11:10:14 +0100 Subject: [PATCH 047/145] Cleaning console at every change --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 24aae7b6a6..65971f925f 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -303,7 +303,12 @@ public static void main(String[] args) { @SuppressWarnings("unchecked") @Override public void actionPerformed(ActionEvent e) { - + + // The console is cleared after any change except opening the witness + if(!e.getActionCommand().equals("Execution Witness")) { + consolePane.setText(""); + } + // The bound field cannot be empty if(boundField.getText().equals("")) { boundField.setText("1"); @@ -341,8 +346,6 @@ public void actionPerformed(ActionEvent e) { menu.add(smmMenuIte); break; } - // The console is cleaned when the task is changed - consolePane.setText(""); tmmScroll.setBorder(border); } } @@ -376,8 +379,6 @@ public void actionPerformed(ActionEvent e) { } if(e.getActionCommand().equals("Test")) { - String result = ""; - consolePane.setText(result); Program pSource = null; Program pTarget = null; Wmm smm = null; @@ -418,6 +419,8 @@ public void actionPerformed(ActionEvent e) { Solver solver = ctx.mkSolver(); Solver solver2 = ctx.mkSolver(); + String result = ""; + switch(opt.getTask()){ case REACHABILITY: result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; @@ -447,10 +450,6 @@ public void actionPerformed(ActionEvent e) { ctx.close(); } - if(e.getActionCommand().equals("Clear")) { - consolePane.setText(""); - } - if(e.getActionCommand().equals("Execution Witness")) { invokeLater(new Runnable() {public void run() {graph.open();}}); } @@ -470,6 +469,7 @@ class BoundListener implements KeyListener { @Override public void keyTyped(KeyEvent event) { try { + consolePane.setText(""); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here @@ -479,6 +479,7 @@ public void keyTyped(KeyEvent event) { @Override public void keyPressed(KeyEvent arg0) { try { + consolePane.setText(""); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here @@ -488,6 +489,7 @@ public void keyPressed(KeyEvent arg0) { @Override public void keyReleased(KeyEvent arg0) { try { + consolePane.setText(""); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here From acc955327d48d567ca643ff3b253433a42f2fb0b Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 6 Mar 2019 11:13:37 +0100 Subject: [PATCH 048/145] Disable execution witness button after every change --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 65971f925f..95a6ddb8cf 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -306,6 +306,7 @@ public void actionPerformed(ActionEvent e) { // The console is cleared after any change except opening the witness if(!e.getActionCommand().equals("Execution Witness")) { + graphButton.setEnabled(false); consolePane.setText(""); } @@ -470,6 +471,7 @@ class BoundListener implements KeyListener { public void keyTyped(KeyEvent event) { try { consolePane.setText(""); + graphButton.setEnabled(false); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here @@ -480,6 +482,7 @@ public void keyTyped(KeyEvent event) { public void keyPressed(KeyEvent arg0) { try { consolePane.setText(""); + graphButton.setEnabled(false); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here @@ -490,6 +493,7 @@ public void keyPressed(KeyEvent arg0) { public void keyReleased(KeyEvent arg0) { try { consolePane.setText(""); + graphButton.setEnabled(false); opt.setBound(Integer.parseInt(boundField.getText())); } catch (Exception e) { // Nothing to do here From 275ac9fa01a28f8c8d4b016d358947dd5189b5a5 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 6 Mar 2019 11:25:22 +0100 Subject: [PATCH 049/145] Refactored graph generate method --- .../java/com/dat3m/ui/option/GraphOption.java | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java index 1921bc4832..7ab9f4dafc 100644 --- a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/option/GraphOption.java @@ -30,28 +30,17 @@ public class GraphOption { private final String TMPDOTPATH = "./.tmp/output.dot"; private final String TMPPNGPATH = "./.tmp/output.png"; - - public void generate(Solver solver, Context ctx, Program p) { - Graph graph = new Graph(solver.getModel(), ctx); - try { - graph.build(p).draw(TMPDOTPATH); - File dotFile = new File(TMPDOTPATH); - // The previous png file needs to be deleted - Path fileToDeletePath = Paths.get(TMPPNGPATH); - Files.delete(fileToDeletePath); - InputStream targetStream = new FileInputStream(dotFile); - MutableGraph g = Parser.read(targetStream); - fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); - dotFile.delete(); - } catch (IOException e) { - // This should never happen since the file is always created - } - } - public void generate(Solver solver, Context ctx, PorthosResult results) { + public void generate(Solver solver, Context ctx, Object o) { Graph graph = new Graph(solver.getModel(), ctx); try { - graph.build(results.getSourceProgram(), results.getTargetProgram()).draw(TMPDOTPATH); + if(o instanceof Program) { + Program p = (Program)o; + graph.build(p).draw(TMPDOTPATH); + } else if (o instanceof PorthosResult) { + PorthosResult result = (PorthosResult)o; + graph.build(result.getSourceProgram(), result.getTargetProgram()).draw(TMPDOTPATH); + } File dotFile = new File(TMPDOTPATH); // The previous png file needs to be deleted Path fileToDeletePath = Paths.get(TMPPNGPATH); @@ -67,7 +56,7 @@ public void generate(Solver solver, Context ctx, PorthosResult results) { public void open() { JLabel label = new JLabel(); - // An image need to be created at every call since thet image changes + // An image need to be created at every call since the image changes label.setIcon(new ImageIcon(getDefaultToolkit().createImage(TMPPNGPATH))); JScrollPane scroll = new JScrollPane(label); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); From cb89c8a82c1c22bef094a560088146f27f6f3c2a Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 6 Mar 2019 11:35:25 +0100 Subject: [PATCH 050/145] Added some comments --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 10 +++++----- ui/src/main/java/com/dat3m/ui/option/Option.java | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 95a6ddb8cf..6c4448898c 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -61,8 +61,8 @@ public class Dat3M extends JPanel implements ActionListener { private static final int width = getMainScreenWidth(); private static final int height = getMainScreenHeight(); - // These two are not final since they can be scaled public static final ImageIcon dartagnanOriginal = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); + // Scaled according to the display public static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -83,6 +83,7 @@ public int getIconWidth() { }; public static final ImageIcon porthosOriginal = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); + // Scaled according to the display public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -102,6 +103,7 @@ public int getIconWidth() { private int newWidth = max(300, (int) round((height / 3))); }; + // Scaled to icon size public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { @Override public void paintIcon( Component c, Graphics g, int x, int y ) { @@ -221,8 +223,6 @@ public Dat3M() { graphButton.addActionListener(this); graphButton.setEnabled(false); - iconPane.setIcon(dartagnanIcon); - //Put the options in a split pane. JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); sp0.setDividerSize(2); @@ -261,7 +261,6 @@ public Dat3M() { hSplitEditors.setOneTouchExpandable(true); hSplitEditors.setDividerSize(2); hSplitEditors.setBorder(new TitledBorder("")); - JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, hSplitEditors); mainPane.setDividerSize(2); @@ -280,6 +279,7 @@ private JScrollPane createScroll(JEditorPane editor, String label) { } public static void main(String[] args) { + // Necessary to avoid horrible layout on splitPane getDefaults().put("SplitPane.border", createEmptyBorder()); invokeLater(new Runnable() {public void run() { JFrame frame = new JFrame("Dat3M"); @@ -304,7 +304,7 @@ public static void main(String[] args) { @Override public void actionPerformed(ActionEvent e) { - // The console is cleared after any change except opening the witness + // The console and graph button are cleared after any change except opening the witness if(!e.getActionCommand().equals("Execution Witness")) { graphButton.setEnabled(false); consolePane.setText(""); diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java index f9e2c58e0e..aed5b6c868 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/option/Option.java @@ -7,7 +7,6 @@ public class Option { - // All these are fields since they need to be updated by the listener private static Task task = Task.REACHABILITY; private static Arch target = Arch.NONE; private static Arch source = Arch.NONE; From 6661f398d95dd1024a33b54dde97efc62ccbb029 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Thu, 7 Mar 2019 10:50:06 +0200 Subject: [PATCH 051/145] Updated gitignore --- .gitignore | 1 + ui/.gitignore | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 ui/.gitignore diff --git a/.gitignore b/.gitignore index 900dd8b3f9..b5ee1c1db7 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ Thumbs.db ########## dartagnan/target/ porthos/target/ +ui/target/ diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100644 index b83d22266a..0000000000 --- a/ui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ From 604c99cde1041c3a01b3cb141828a17be5ef020d Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Thu, 7 Mar 2019 11:41:30 +0200 Subject: [PATCH 052/145] Minor refactoring --- ui/src/main/java/com/dat3m/ui/utils/Selector.java | 6 ++---- ui/src/main/java/com/dat3m/ui/utils/Utils.java | 7 +++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/utils/Selector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java index 0274a7ce6a..e13b594bf2 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Selector.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Selector.java @@ -1,7 +1,5 @@ package com.dat3m.ui.utils; -import static java.awt.FlowLayout.LEFT; - import java.awt.FlowLayout; import java.awt.event.ActionListener; @@ -14,11 +12,11 @@ public class Selector extends JPanel { private JComboBox selector; public Selector(Object[] options, String label, ActionListener caller) { - selector = new JComboBox(options); + selector = new JComboBox<>(options); selector.setActionCommand(label); selector.addActionListener(caller); JLabel sLabel = new JLabel(label + ": "); - this.setLayout(new FlowLayout(LEFT)); + this.setLayout(new FlowLayout(FlowLayout.LEFT)); this.add(sLabel); this.add(selector); } diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 29f125d56c..e85f1fa9c3 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -37,8 +37,7 @@ public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOExcept return mm; } - private static File createTmpFile(JEditorPane editor, String path) - throws IOException, FileNotFoundException { + private static File createTmpFile(JEditorPane editor, String path) throws IOException { File tmpProgramFile = new File(path); if (!tmpProgramFile.getParentFile().exists()) { tmpProgramFile.getParentFile().mkdirs(); @@ -56,7 +55,7 @@ public static int getMainScreenWidth() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); if (gs.length > 0) { - return (int) round(gs[0].getDisplayMode().getWidth()); + return round(gs[0].getDisplayMode().getWidth()); } return 0; } @@ -65,7 +64,7 @@ public static int getMainScreenHeight() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); if (gs.length > 0) { - return (int) round(gs[0].getDisplayMode().getHeight()); + return round(gs[0].getDisplayMode().getHeight()); } return 0; } From 6ba1df121dc451bb5bd4cdb34f53f2895c5b202c Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Thu, 7 Mar 2019 18:18:17 +0200 Subject: [PATCH 053/145] Refactoring: part 1 --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 557 ++++++------------ .../main/java/com/dat3m/ui/editor/Editor.java | 69 +++ .../java/com/dat3m/ui/editor/EditorCode.java | 19 + .../java/com/dat3m/ui/editor/EditorPane.java | 96 +++ .../main/java/com/dat3m/ui/icon/IconCode.java | 40 ++ .../java/com/dat3m/ui/icon/IconHelper.java | 42 ++ .../main/java/com/dat3m/ui/option/Option.java | 36 +- .../com/dat3m/ui/utils/BoundListener.java | 45 ++ .../main/java/com/dat3m/ui/utils/Utils.java | 1 - .../main/java/com/datem/ui/menu/MenuItem.java | 60 -- 10 files changed, 516 insertions(+), 449 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/editor/Editor.java create mode 100644 ui/src/main/java/com/dat3m/ui/editor/EditorCode.java create mode 100644 ui/src/main/java/com/dat3m/ui/editor/EditorPane.java create mode 100644 ui/src/main/java/com/dat3m/ui/icon/IconCode.java create mode 100644 ui/src/main/java/com/dat3m/ui/icon/IconHelper.java create mode 100644 ui/src/main/java/com/dat3m/ui/utils/BoundListener.java delete mode 100644 ui/src/main/java/com/datem/ui/menu/MenuItem.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 6c4448898c..74b920b4cd 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -1,8 +1,6 @@ package com.dat3m.ui; -import javax.swing.*; -import javax.swing.border.TitledBorder; - +import com.dat3m.dartagnan.Dartagnan; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.Wmm; @@ -10,35 +8,24 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.editor.Editor; +import com.dat3m.ui.editor.EditorCode; +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.icon.IconHelper; import com.dat3m.ui.option.GraphOption; import com.dat3m.ui.option.Option; -import com.dat3m.ui.utils.Selector; -import com.dat3m.ui.utils.Task; -import com.datem.ui.menu.MenuItem; +import com.dat3m.ui.utils.*; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; -import static com.dat3m.dartagnan.Dartagnan.canDrawGraph; -import static com.dat3m.dartagnan.Dartagnan.testProgram; -import static com.dat3m.dartagnan.program.utils.Alias.CFIS; -import static com.dat3m.dartagnan.program.utils.Alias.CFS; -import static com.dat3m.dartagnan.wmm.utils.Arch.ARM; -import static com.dat3m.dartagnan.wmm.utils.Arch.ARM8; -import static com.dat3m.dartagnan.wmm.utils.Arch.POWER; -import static com.dat3m.dartagnan.wmm.utils.Arch.TSO; -import static com.dat3m.dartagnan.wmm.utils.Mode.IDL; -import static com.dat3m.dartagnan.wmm.utils.Mode.KLEENE; -import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; -import static com.dat3m.ui.utils.Task.PORTABILITY; -import static com.dat3m.ui.utils.Task.REACHABILITY; -import static com.dat3m.ui.utils.Utils.getMainScreenHeight; -import static com.dat3m.ui.utils.Utils.getMainScreenWidth; -import static com.dat3m.ui.utils.Utils.parseMMEditor; -import static com.dat3m.ui.utils.Utils.parseProgramEditor; +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + import static java.awt.FlowLayout.LEFT; import static java.awt.FlowLayout.RIGHT; -import static java.lang.Math.max; -import static java.lang.Math.round; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.JOptionPane.INFORMATION_MESSAGE; @@ -47,132 +34,43 @@ import static javax.swing.UIManager.getDefaults; import static javax.swing.border.TitledBorder.CENTER; -import java.awt.*; -import java.awt.event.*; -import java.util.ArrayList; - -public class Dat3M extends JPanel implements ActionListener { - - public static final String PROGRAMLABEL = "Program"; - public static final String MMLABEL = "Memory Model"; - public static final String SMMLABEL = "Source Memory Model"; - public static final String TMMLABEL = "Target Memory Model"; - - private static final int width = getMainScreenWidth(); - private static final int height = getMainScreenHeight(); - - public static final ImageIcon dartagnanOriginal = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan"); - // Scaled according to the display - public static final ImageIcon dartagnanIcon = new ImageIcon(Dat3M.class.getResource("/dartagnan.jpg"), "Dartagnan") { - @Override - public void paintIcon( Component c, Graphics g, int x, int y ) { - g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); - } - - @Override - public int getIconHeight() { - return dartagnanOriginal.getIconHeight() * newWidth / dartagnanOriginal.getIconWidth(); - } - - @Override - public int getIconWidth() { - return newWidth; - } - - private int newWidth = max(300, (int) round((height / 3))); - }; - - public static final ImageIcon porthosOriginal = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos"); - // Scaled according to the display - public static final ImageIcon porthosIcon = new ImageIcon(Dat3M.class.getResource("/porthos.jpg"), "Porthos") { - @Override - public void paintIcon( Component c, Graphics g, int x, int y ) { - g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); - } - - @Override - public int getIconHeight() { - return porthosOriginal.getIconHeight() * newWidth / porthosOriginal.getIconWidth(); - } - - @Override - public int getIconWidth() { - return newWidth; - } - - private int newWidth = max(300, (int) round((height / 3))); -}; - - // Scaled to icon size - public static final ImageIcon dat3mIcon = new ImageIcon(Dat3M.class.getResource("/dat3m.png"), "Dat3m") { - @Override - public void paintIcon( Component c, Graphics g, int x, int y ) { - g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); - } - - @Override - public int getIconHeight() { - return 60; - } - - @Override - public int getIconWidth() { - return 60; - } - }; - - // All these panes are fields since they need to be updated by the listener - private static JMenu menu = new JMenu("Import"); - private static JLabel iconPane = new JLabel(dartagnanIcon, JLabel.CENTER); - // Editors and Menu Items - private static JEditorPane pEditor = new JEditorPane(); - private static MenuItem pMenuItem; - private static JSplitPane vSplitEditors; - private static JScrollPane smmScroll; - private static JEditorPane smmEditor = new JEditorPane(); - private static MenuItem smmMenuIte; - private static JScrollPane tmmScroll; - private static JEditorPane tmmEditor = new JEditorPane(); - private static MenuItem tmmMenuIte; +public class Dat3M extends JFrame implements ActionListener { + + // All these panes are fields since they need to be updated by the listener + // TODO: Height must come from the pane with controls + private JLabel iconPane = new JLabel(IconHelper.getIcon(IconCode.DARTAGNAN, 300), JLabel.CENTER); + // Options pane - private static JTextPane consolePane; - private static JTextField boundField; - private static JPanel sArchPane; - private static JPanel tArchPane; - private static JButton graphButton; - private static Option opt = new Option(REACHABILITY, Arch.NONE, Arch.NONE, KNASTER, CFS, 1); - + private JTextPane consolePane; + private JTextField boundField; + private JPanel sArchPane; + private JPanel tArchPane; + private JButton graphButton; + private Option opt = new Option(Task.REACHABILITY, Arch.NONE, Arch.NONE, Mode.KNASTER, Alias.CFS, 1); + // Execution witness - private static GraphOption graph = new GraphOption(); - - public Dat3M() { - - setLayout(new BorderLayout()); - JFileChooser chooser = new JFileChooser(); - - ArrayList pExtensions = new ArrayList(); - pExtensions.add("litmus"); - pExtensions.add("pts"); - pMenuItem = new MenuItem("Program", chooser, pExtensions, pEditor, this); - pMenuItem.addActionListener(this); - - ArrayList mmExtensions = new ArrayList(); - mmExtensions.add("cat"); - smmMenuIte = new MenuItem(SMMLABEL, chooser, mmExtensions, smmEditor, this); - tmmMenuIte = new MenuItem(MMLABEL, chooser, mmExtensions, tmmEditor, this); - - menu.add(pMenuItem); - // Initially only one MM can be loaded - menu.add(tmmMenuIte); - - JScrollPane pScroll = createScroll(pEditor, PROGRAMLABEL); - smmScroll = createScroll(smmEditor, SMMLABEL); - tmmScroll = createScroll(tmmEditor, MMLABEL); - - Task[] tasks = { REACHABILITY, PORTABILITY }; + private GraphOption graph = new GraphOption(); + + private Editor editor; + + private Dat3M() { + // Necessary to avoid horrible layout on splitPane + getDefaults().put("SplitPane.border", createEmptyBorder()); + + setTitle("Dat3M"); + setExtendedState(JFrame.MAXIMIZED_BOTH); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLayout(new BorderLayout()); + setIconImage(IconHelper.getIcon(IconCode.DAT3M).getImage()); + + editor = new Editor(); + setJMenuBar(editor.getMenuBar()); + + int width = Utils.getMainScreenWidth(); + Task[] tasks = { Task.REACHABILITY, Task.PORTABILITY }; JPanel taskPane = new Selector(tasks, "Task", this); - Arch[] archs = { Arch.NONE, TSO, POWER, ARM, ARM8 }; + Arch[] archs = { Arch.NONE, Arch.TSO, Arch.POWER, Arch.ARM, Arch.ARM8 }; tArchPane = new Selector(archs, "Target", this); sArchPane = new Selector(archs, "Source", this); sArchPane.setLayout(new FlowLayout(RIGHT)); @@ -183,122 +81,89 @@ public Dat3M() { archPane.setPreferredSize(new Dimension(300, 0)); archPane.setDividerSize(0); - Mode[] modes = { KNASTER, IDL, KLEENE }; - JPanel modePane = new Selector(modes, "Mode", this); - - Alias[] aliases = { CFS, Alias.NONE, CFIS }; - JPanel aliasPane = new Selector(aliases, "Alias", this); - - // Bound editor - boundField = new JTextField(3); - boundField.setText("1"); - boundField.setActionCommand("Bound"); - boundField.addActionListener(this); - boundField.addKeyListener(new BoundListener()); - JLabel uLabel = new JLabel("Unrolling Bound: "); + Mode[] modes = { Mode.KNASTER, Mode.IDL, Mode.KLEENE }; + JPanel modePane = new Selector(modes, "Mode", this); + + Alias[] aliases = { Alias.NONE, Alias.CFIS, Alias.CFS }; + JPanel aliasPane = new Selector(aliases, "Alias", this); + + // Console. + consolePane = new JTextPane(); + consolePane.setEditable(false); + JScrollPane scrollConsole = new JScrollPane(consolePane); + scrollConsole.setMinimumSize(new Dimension(0, 120)); + scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + // Graph button. + graphButton = new JButton("Execution Witness"); + graphButton.setMaximumSize(new Dimension(width, 50)); + graphButton.addActionListener(this); + graphButton.setEnabled(false); + + + // Bound editor + boundField = new JTextField(3); + boundField.setText("1"); + boundField.setActionCommand("Bound"); + boundField.addActionListener(this); + boundField.addKeyListener(new BoundListener(consolePane, graphButton, boundField, opt)); + JLabel uLabel = new JLabel("Unrolling Bound: "); JPanel boundPane = new JPanel(new FlowLayout(LEFT)); boundPane.add(uLabel); boundPane.add(boundField); - // Console. - consolePane = new JTextPane(); - consolePane.setEditable(false); - JScrollPane scrollConsole = new JScrollPane(consolePane); - scrollConsole.setMinimumSize(new Dimension(0, 120)); - scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - - // Test button. - JButton testButton = new JButton("Test"); - testButton.setMaximumSize(new Dimension(width, 50)); - testButton.addActionListener(this); - - // Clear button. - JButton clearButton = new JButton("Clear"); - clearButton.setMaximumSize(new Dimension(width, 50)); - clearButton.addActionListener(this); - - // Graph button. - graphButton = new JButton("Execution Witness"); - graphButton.setMaximumSize(new Dimension(width, 50)); - graphButton.addActionListener(this); - graphButton.setEnabled(false); - - //Put the options in a split pane. - JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); - sp0.setDividerSize(2); - JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); - sp1.setDividerSize(2); - JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); - sp2.setDividerSize(2); - JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); - sp3.setDividerSize(2); - JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); - sp4.setDividerSize(2); - JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); - sp5.setDividerSize(2); - JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); - sp6.setDividerSize(2); - JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); - sp7.setDividerSize(2); - JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); - sp8.setDividerSize(2); - JPanel optionsPane = new JPanel(new GridLayout(1,0)); - TitledBorder titledBorder = createTitledBorder("Options"); - titledBorder.setTitleJustification(CENTER); - optionsPane.add(sp8); - optionsPane.setBorder(titledBorder); - optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); - - //Put the editors in a split pane. - vSplitEditors = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - vSplitEditors.setBottomComponent(tmmScroll); - vSplitEditors.setOneTouchExpandable(true); - vSplitEditors.setDividerSize(0); - vSplitEditors.setPreferredSize(new Dimension(width / 3, height / 3)); - vSplitEditors.setBorder(new TitledBorder("")); - - JSplitPane hSplitEditors = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pScroll, vSplitEditors); - hSplitEditors.setOneTouchExpandable(true); - hSplitEditors.setDividerSize(2); - hSplitEditors.setBorder(new TitledBorder("")); - - JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, hSplitEditors); - mainPane.setDividerSize(2); - add(mainPane); - } - - private JScrollPane createScroll(JEditorPane editor, String label) { - JScrollPane pScroll = new JScrollPane(editor); - pScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - pScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - pScroll.setPreferredSize(new Dimension(width / 3, height / 3)); - TitledBorder border = createTitledBorder(label); - border.setTitleJustification(CENTER); - pScroll.setBorder(border); - return pScroll; + // Test button. + JButton testButton = new JButton("Test"); + testButton.setMaximumSize(new Dimension(width, 50)); + testButton.addActionListener(this); + + // Clear button. + JButton clearButton = new JButton("Clear"); + clearButton.setMaximumSize(new Dimension(width, 50)); + clearButton.addActionListener(this); + + //Put the options in a split pane. + JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); + sp0.setDividerSize(2); + JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); + sp1.setDividerSize(2); + JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); + sp2.setDividerSize(2); + JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); + sp3.setDividerSize(2); + JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); + sp4.setDividerSize(2); + JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); + sp5.setDividerSize(2); + JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); + sp6.setDividerSize(2); + JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); + sp7.setDividerSize(2); + JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); + sp8.setDividerSize(2); + + JPanel optionsPane = new JPanel(new GridLayout(1,0)); + TitledBorder titledBorder = createTitledBorder("Options"); + titledBorder.setTitleJustification(CENTER); + optionsPane.add(sp8); + optionsPane.setBorder(titledBorder); + //optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); + + //Put the editors in a split pane. + JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editor.getMainPane()); + mainPane.setDividerSize(2); + add(mainPane); + + //Display the window. + pack(); } - public static void main(String[] args) { - // Necessary to avoid horrible layout on splitPane - getDefaults().put("SplitPane.border", createEmptyBorder()); - invokeLater(new Runnable() {public void run() { - JFrame frame = new JFrame("Dat3M"); - frame.setExtendedState(JFrame.MAXIMIZED_BOTH); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(menu); - frame.setJMenuBar(menuBar); - frame.setIconImage(dat3mIcon.getImage()); - - //Add content to the window. - frame.add(new Dat3M()); - - //Display the window. - frame.pack(); - frame.setVisible(true); - ;}}); - } + public static void main(String[] args) { + EventQueue.invokeLater(() -> { + Dat3M app = new Dat3M(); + app.setVisible(true); + }); + } @SuppressWarnings("unchecked") @Override @@ -319,35 +184,22 @@ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if(source instanceof JComboBox) { opt.setTask((Task) ((JComboBox)source).getSelectedItem()); - TitledBorder border = (TitledBorder) tmmScroll.getBorder(); - switch(opt.getTask()){ - case REACHABILITY: - // Update image - iconPane.setIcon(dartagnanIcon); - // Remove smmEditor - if(vSplitEditors.getTopComponent() == smmScroll) { - vSplitEditors.remove(smmScroll); - } - // Update editor and menutItem labels - border.setTitle(MMLABEL); - menu.getItem(1).setText(MMLABEL); - // Remove source memory model importer item - if(menu.getItemCount() > 2 && menu.getItem(2) == smmMenuIte) { - menu.remove(smmMenuIte); - } - break; - case PORTABILITY: - // Update image - iconPane.setIcon(porthosIcon); - // Add smmEditor - vSplitEditors.setTopComponent(smmScroll); - // Update editor and menutItem labels - border.setTitle(TMMLABEL); - menu.getItem(1).setText(TMMLABEL); - menu.add(smmMenuIte); - break; - } - tmmScroll.setBorder(border); + switch(opt.getTask()){ + case REACHABILITY: + // Update image + // TODO: Height must come from the pane with controls + iconPane.setIcon(IconHelper.getIcon(IconCode.DARTAGNAN, 300)); + // Remove smmEditor + editor.setShowSourceMM(false); + break; + case PORTABILITY: + // Update image + // TODO: Height must come from the pane with controls + iconPane.setIcon(IconHelper.getIcon(IconCode.PORTHOS, 300)); + // Add smmEditor + editor.setShowSourceMM(true); + break; + } } } @@ -380,124 +232,89 @@ public void actionPerformed(ActionEvent e) { } if(e.getActionCommand().equals("Test")) { - Program pSource = null; - Program pTarget = null; + Program pSource = null; + Program pTarget = null; Wmm smm = null; Wmm tmm = null; try { - pTarget = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); + pTarget = Utils.parseProgramEditor(editor.getEditor(EditorCode.PROGRAM), editor.getLoadedFormat(EditorCode.PROGRAM)); } catch (Exception exp) { - showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); return; } - try { - tmm = parseMMEditor(tmmEditor, opt.getTarget()); + try { + tmm = Utils.parseMMEditor(editor.getEditor(EditorCode.TARGET_MM), opt.getTarget()); } catch (Exception exp) { - String dummy = opt.getTask() == REACHABILITY ? " " : " target "; - showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); + String dummy = opt.getTask() == Task.REACHABILITY ? " " : " target "; + showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); return; } - if(opt.getTask() == PORTABILITY) { - if(!pMenuItem.getLoadedFormat().equals("pts")) { - showMessageDialog(null, "Porthos only supports *.pts format", "About", INFORMATION_MESSAGE, dat3mIcon); + if(opt.getTask() == Task.PORTABILITY) { + if(!editor.getLoadedFormat(EditorCode.PROGRAM).equals("pts")) { + showMessageDialog(null, "Porthos only supports *.pts format", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); return; } try { - pSource = parseProgramEditor(pEditor, pMenuItem.getLoadedFormat()); + pSource = Utils.parseProgramEditor(editor.getEditor(EditorCode.PROGRAM), editor.getLoadedFormat(EditorCode.PROGRAM)); } catch (Exception exp) { - showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); return; } try { - smm = parseMMEditor(smmEditor, opt.getSource()); + smm = Utils.parseMMEditor(editor.getEditor(EditorCode.SOURCE_MM), opt.getSource()); } catch (Exception exp) { - showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, dat3mIcon); + showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); return; - } + } } - + Context ctx = new Context(); Solver solver = ctx.mkSolver(); Solver solver2 = ctx.mkSolver(); - - String result = ""; + + String result = ""; switch(opt.getTask()){ - case REACHABILITY: - result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; - Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); - boolean isSat = testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); - result += isSat ? "OK" : "No"; - if(canDrawGraph(pTarget.getAss(), isSat)) { - graphButton.setEnabled(true); - graph.generate(solver, ctx, pTarget); - } else { - graphButton.setEnabled(false); - } - break; - case PORTABILITY: - PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); - String dummy = res.getIsPortable()? " " : " not "; - result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); - if(!res.getIsPortable()) { - graphButton.setEnabled(true); - graph.generate(solver, ctx, res); - } else { - graphButton.setEnabled(false); - } - break; - } - consolePane.setText(result); - ctx.close(); + case REACHABILITY: + result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; + Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); + boolean isSat = Dartagnan.testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); + result += isSat ? "OK" : "No"; + if(Dartagnan.canDrawGraph(pTarget.getAss(), isSat)) { + graphButton.setEnabled(true); + graph.generate(solver, ctx, pTarget); + } else { + graphButton.setEnabled(false); + } + break; + case PORTABILITY: + PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); + String dummy = res.getIsPortable()? " " : " not "; + result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); + if(!res.getIsPortable()) { + graphButton.setEnabled(true); + graph.generate(solver, ctx, res); + } else { + graphButton.setEnabled(false); + } + break; + } + consolePane.setText(result); + ctx.close(); } if(e.getActionCommand().equals("Execution Witness")) { - invokeLater(new Runnable() {public void run() {graph.open();}}); + invokeLater(new Runnable() {public void run() {graph.open();}}); } - + // We update the task selectors tArchPane.setEnabled(false); sArchPane.setEnabled(false); - if(!pMenuItem.getLoadedFormat().equals("litmus")) { + if(!editor.getLoadedFormat(EditorCode.PROGRAM).equals("litmus")) { tArchPane.setEnabled(true); - if(opt.getTask().equals(PORTABILITY)) { + if(opt.getTask().equals(Task.PORTABILITY)) { sArchPane.setEnabled(true); } } } - - class BoundListener implements KeyListener { - @Override - public void keyTyped(KeyEvent event) { - try { - consolePane.setText(""); - graphButton.setEnabled(false); - opt.setBound(Integer.parseInt(boundField.getText())); - } catch (Exception e) { - // Nothing to do here - } - } - - @Override - public void keyPressed(KeyEvent arg0) { - try { - consolePane.setText(""); - graphButton.setEnabled(false); - opt.setBound(Integer.parseInt(boundField.getText())); - } catch (Exception e) { - // Nothing to do here - } - } - - @Override - public void keyReleased(KeyEvent arg0) { - try { - consolePane.setText(""); - graphButton.setEnabled(false); - opt.setBound(Integer.parseInt(boundField.getText())); - } catch (Exception e) { - // Nothing to do here - } - } - }; } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java new file mode 100644 index 0000000000..29d8d35634 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -0,0 +1,69 @@ +package com.dat3m.ui.editor; + +import com.google.common.collect.ImmutableMap; + +import javax.swing.*; +import javax.swing.border.TitledBorder; + +public class Editor { + + private final ImmutableMap editorPanes = ImmutableMap.of( + EditorCode.PROGRAM, new EditorPane(EditorCode.PROGRAM, new JEditorPane(), "litmus", "pts"), + EditorCode.SOURCE_MM, new EditorPane(EditorCode.SOURCE_MM, new JEditorPane(), "cat"), + EditorCode.TARGET_MM, new EditorPane(EditorCode.TARGET_MM, new JEditorPane(), "cat") + ); + + private final JMenu menu; + private final JMenuBar menuBar; + + private final JSplitPane mmPane; + private final JSplitPane mainPane; + + + public Editor(){ + menu = new JMenu("Import"); + menu.add(editorPanes.get(EditorCode.PROGRAM).getMenuItem()); + menu.add(editorPanes.get(EditorCode.TARGET_MM).getMenuItem()); + this.menuBar = new JMenuBar(); + menuBar.add(menu); + + mmPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + mmPane.setBottomComponent(editorPanes.get(EditorCode.TARGET_MM)); + mmPane.setOneTouchExpandable(true); + mmPane.setDividerSize(0); + mmPane.setBorder(new TitledBorder("")); + + mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, editorPanes.get(EditorCode.PROGRAM), mmPane); + mainPane.setOneTouchExpandable(true); + mainPane.setDividerSize(2); + mainPane.setDividerLocation(0.5); + mainPane.setBorder(new TitledBorder("")); + } + + public JMenuBar getMenuBar(){ + return menuBar; + } + + public JSplitPane getMainPane(){ + return mainPane; + } + + public JEditorPane getEditor(EditorCode code){ + return editorPanes.get(code).getEditor(); + } + + public String getLoadedFormat(EditorCode code){ + return editorPanes.get(code).getLoadedFormat(); + } + + public void setShowSourceMM(boolean flag){ + if(flag){ + mmPane.setTopComponent(editorPanes.get(EditorCode.SOURCE_MM)); + mmPane.setDividerLocation(0.5); + menu.add(editorPanes.get(EditorCode.SOURCE_MM).getMenuItem(), 1); + } else { + mmPane.remove(editorPanes.get(EditorCode.SOURCE_MM)); + menu.remove(editorPanes.get(EditorCode.SOURCE_MM).getMenuItem()); + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java new file mode 100644 index 0000000000..634affd825 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java @@ -0,0 +1,19 @@ +package com.dat3m.ui.editor; + +public enum EditorCode { + + PROGRAM, SOURCE_MM, TARGET_MM; + + @Override + public String toString(){ + switch(this){ + case PROGRAM: + return "Program"; + case SOURCE_MM: + return "Source Memory Model"; + case TARGET_MM: + return "Target Memory Model"; + } + return super.toString(); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java new file mode 100644 index 0000000000..d56b249364 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java @@ -0,0 +1,96 @@ +package com.dat3m.ui.editor; + +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.icon.IconHelper; +import com.google.common.collect.ImmutableSet; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; + +import static java.lang.System.getProperty; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JFileChooser.APPROVE_OPTION; + +public class EditorPane extends JScrollPane implements ActionListener { + + private final JEditorPane editorPane; + private final JMenuItem menuItem; + private final JFileChooser chooser; + private final ImmutableSet allowedFormats; + + private String loadedFormat = ""; + + EditorPane(EditorCode code, JEditorPane editorPane, String... formats){ + super(editorPane); + this.editorPane = editorPane; + this.menuItem = new JMenuItem(code.toString()); + menuItem.addActionListener(this); + + this.allowedFormats = ImmutableSet.copyOf(Arrays.asList(formats)); + this.chooser = new JFileChooser(); + for(String format : allowedFormats) { + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + format, format)); + } + + setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + TitledBorder border = createTitledBorder(code.toString()); + border.setTitleJustification(TitledBorder.CENTER); + setBorder(border); + } + + JEditorPane getEditor(){ + return editorPane; + } + + JMenuItem getMenuItem(){ + return menuItem; + } + + String getLoadedFormat(){ + return loadedFormat; + } + + @Override + public void actionPerformed(ActionEvent event) { + Object source = event.getSource(); + if(source instanceof JMenuItem){ + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + int result = chooser.showOpenDialog(null); + if(result == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); + + if(allowedFormats.contains(loadedFormat)){ + try { + editorPane.read(new InputStreamReader(new FileInputStream(path)), null); + } catch (IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog( + null, + "Error reading input file", + "Error", + JOptionPane.ERROR_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M)); + } + } else { + JOptionPane.showMessageDialog( + null, + "Please select a *." + String.join(", *.", allowedFormats) + " file", + "Invalid file format", + JOptionPane.INFORMATION_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M)); + } + } + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java new file mode 100644 index 0000000000..ec48a23793 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java @@ -0,0 +1,40 @@ +package com.dat3m.ui.icon; + +import com.dat3m.ui.Dat3M; + +import java.net.URL; + +public enum IconCode { + + DAT3M, DARTAGNAN, PORTHOS; + + @Override + public String toString(){ + switch(this){ + case DAT3M: + return "Dat3M"; + case DARTAGNAN: + return "Dartagnan"; + case PORTHOS: + return "Porthos"; + } + return super.toString(); + } + + public URL getPath(){ + System.out.println(getClass().getResource("test")); + switch(this){ + case DAT3M: + return getResource("/dat3m.png"); + case DARTAGNAN: + return getResource("/dartagnan.jpg"); + case PORTHOS: + return getResource("/porthos.jpg"); + } + throw new RuntimeException("Illegal IconCode option"); + } + + private URL getResource(String filename){ + return Dat3M.class.getResource(filename); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java b/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java new file mode 100644 index 0000000000..0911507700 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java @@ -0,0 +1,42 @@ +package com.dat3m.ui.icon; + +import javax.swing.*; +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +public class IconHelper { + + private static Map> data = new HashMap<>(); + + public static ImageIcon getIcon(IconCode code){ + return getIcon(code, -1); + } + + public static ImageIcon getIcon(IconCode code, int height){ + data.putIfAbsent(code, new HashMap<>()); + Map heightMap = data.get(code); + height = Math.max(-1, height); + if(!heightMap.containsKey(height)){ + heightMap.put(height, mkIcon(code, height)); + } + return heightMap.get(height); + } + + private static ImageIcon mkIcon(IconCode code, int height){ + System.out.println("mkIcon called for " + code + " " + height); + ImageIcon origImage = new ImageIcon(code.getPath(), code.toString()); + if(height == -1){ + return origImage; + } + + if(height > origImage.getIconHeight()){ + System.err.println("Warning: scaling image large its original size might degrade image quality"); + } + + int width = origImage.getIconWidth() * height / origImage.getIconHeight(); + Image image = origImage.getImage(); + Image scaledImage = image.getScaledInstance(width, height, Image.SCALE_SMOOTH); + return new ImageIcon(scaledImage); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java index aed5b6c868..a25d2a75ef 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/option/Option.java @@ -7,20 +7,20 @@ public class Option { - private static Task task = Task.REACHABILITY; - private static Arch target = Arch.NONE; - private static Arch source = Arch.NONE; - private static Mode mode = Mode.KNASTER; - private static Alias alias = Alias.CFS; - private static int bound = 1; + private Task task; + private Arch target; + private Arch source; + private Mode mode; + private Alias alias; + private int bound; public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { - Option.task = task; - Option.target = target; - Option.source = source; - Option.mode = mode; - Option.alias = alias; - Option.bound = bound; + this.task = task; + this.source = source; + this.target = target; + this.mode = mode; + this.alias = alias; + this.bound = bound; } public Task getTask() { @@ -28,7 +28,7 @@ public Task getTask() { } public void setTask(Task task) { - Option.task = task; + this.task = task; } public Arch getTarget() { @@ -36,7 +36,7 @@ public Arch getTarget() { } public void setTarget(Arch target) { - Option.target = target; + this.target = target; } public Arch getSource() { @@ -44,7 +44,7 @@ public Arch getSource() { } public void setSource(Arch source) { - Option.source = source; + this.source = source; } public Mode getMode() { @@ -52,7 +52,7 @@ public Mode getMode() { } public void setMode(Mode mode) { - Option.mode = mode; + this.mode = mode; } public Alias getAlias() { @@ -60,7 +60,7 @@ public Alias getAlias() { } public void setAlias(Alias alias) { - Option.alias = alias; + this.alias = alias; } public int getBound() { @@ -68,6 +68,6 @@ public int getBound() { } public void setBound(int bound) { - Option.bound = bound; + this.bound = bound; } } diff --git a/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java b/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java new file mode 100644 index 0000000000..9e9a465c82 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java @@ -0,0 +1,45 @@ +package com.dat3m.ui.utils; + +import com.dat3m.ui.option.Option; + +import javax.swing.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class BoundListener implements KeyListener { + + private JTextPane consolePane; + private JButton graphButton; + private JTextField boundField; + private Option option; + + public BoundListener(JTextPane consolePane, JButton graphButton, JTextField boundField, Option option){ + this.consolePane = checkNotNull(consolePane); + this.graphButton = checkNotNull(graphButton); + this.boundField = checkNotNull(boundField); + this.option = checkNotNull(option); + } + + @Override + public void keyTyped(KeyEvent event) { + // Nothing to do here + } + + @Override + public void keyPressed(KeyEvent arg0) { + // Nothing to do here + } + + @Override + public void keyReleased(KeyEvent arg0) { + try { + consolePane.setText(""); + graphButton.setEnabled(false); + option.setBound(Integer.parseInt(boundField.getText())); + } catch (Exception e) { + // Nothing to do here + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index e85f1fa9c3..1ececc5c7d 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -5,7 +5,6 @@ import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; diff --git a/ui/src/main/java/com/datem/ui/menu/MenuItem.java b/ui/src/main/java/com/datem/ui/menu/MenuItem.java deleted file mode 100644 index bcd95c8805..0000000000 --- a/ui/src/main/java/com/datem/ui/menu/MenuItem.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.datem.ui.menu; - -import static com.dat3m.ui.Dat3M.dat3mIcon; -import static java.lang.System.getProperty; -import static java.util.stream.Collectors.joining; -import static javax.swing.JFileChooser.APPROVE_OPTION; -import static javax.swing.JOptionPane.INFORMATION_MESSAGE; -import static javax.swing.JOptionPane.showMessageDialog; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; - -import javax.swing.JEditorPane; -import javax.swing.JFileChooser; -import javax.swing.JMenuItem; -import javax.swing.filechooser.FileNameExtensionFilter; - -public class MenuItem extends JMenuItem { - - private String loadedFormat = ""; - - public MenuItem(String label, JFileChooser chooser, List extensions, JEditorPane editor, ActionListener caller) { - super(label); - - chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - for(String ext : extensions) { - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + ext, ext)); - } - - addActionListener(caller); - addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event){ - int r = chooser.showOpenDialog(null); - if(r == APPROVE_OPTION){ - String path = chooser.getSelectedFile().getPath(); - loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); - if(!extensions.contains(loadedFormat)) { - showMessageDialog(null, "Please select a *." + extensions.stream().collect(joining(", *.")) + " file", "About", INFORMATION_MESSAGE, dat3mIcon); - return; - } - try { - editor.read(new InputStreamReader(new FileInputStream(path)), null); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }); - - } - - public String getLoadedFormat() { - return loadedFormat; - } -} From 5f8b11ee1b5ee58b9387fdfa4bb68839e41de204 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Thu, 7 Mar 2019 18:22:02 +0200 Subject: [PATCH 054/145] Removed debug printing --- ui/src/main/java/com/dat3m/ui/icon/IconCode.java | 1 - ui/src/main/java/com/dat3m/ui/icon/IconHelper.java | 1 - 2 files changed, 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java index ec48a23793..efb96cd007 100644 --- a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java +++ b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java @@ -22,7 +22,6 @@ public String toString(){ } public URL getPath(){ - System.out.println(getClass().getResource("test")); switch(this){ case DAT3M: return getResource("/dat3m.png"); diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java b/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java index 0911507700..8ace82c641 100644 --- a/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java +++ b/ui/src/main/java/com/dat3m/ui/icon/IconHelper.java @@ -24,7 +24,6 @@ public static ImageIcon getIcon(IconCode code, int height){ } private static ImageIcon mkIcon(IconCode code, int height){ - System.out.println("mkIcon called for " + code + " " + height); ImageIcon origImage = new ImageIcon(code.getPath(), code.toString()); if(height == -1){ return origImage; From ec5253e061c7e7a2f065fc7437784e50c5193dcf Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 8 Mar 2019 17:23:27 +0200 Subject: [PATCH 055/145] Refactoring part 2 --- .../java/com/dat3m/dartagnan/Dartagnan.java | 2 +- .../dartagnan/parsers/cat/ParserCat.java | 12 +- .../parsers/program/ParserInterface.java | 5 +- .../parsers/program/ParserLitmusAArch64.java | 11 +- .../parsers/program/ParserLitmusC.java | 11 +- .../parsers/program/ParserLitmusPPC.java | 11 +- .../parsers/program/ParserLitmusX86.java | 11 +- .../parsers/program/ParserPorthos.java | 14 +- .../parsers/program/ProgramParser.java | 54 +-- .../com/dat3m/dartagnan/wmm/utils/Arch.java | 16 +- .../dartagnan/AbstractDartagnanTest.java | 2 +- .../dartagnan/DartagnanArrayValidTest.java | 2 +- .../dat3m/dartagnan/DartagnanBranchTest.java | 2 +- .../dartagnan/DartagnanUnrollWhileTest.java | 2 +- .../main/java/com/dat3m/porthos/Porthos.java | 4 +- .../java/com/dat3m/porthos/PorthosTest.java | 8 +- ui/src/main/java/com/dat3m/ui/Dat3M.java | 310 +++--------------- .../main/java/com/dat3m/ui/editor/Editor.java | 130 +++++--- .../java/com/dat3m/ui/editor/EditorCode.java | 24 ++ .../java/com/dat3m/ui/editor/EditorPane.java | 96 ------ .../java/com/dat3m/ui/editor/EditorsPane.java | 68 ++++ .../main/java/com/dat3m/ui/option/Option.java | 46 +-- .../java/com/dat3m/ui/options/IconPane.java | 32 ++ .../com/dat3m/ui/options/OptionsPane.java | 193 +++++++++++ .../java/com/dat3m/ui/options/Selector.java | 34 ++ .../dat3m/ui/options/utils/ArchManager.java | 43 +++ .../dat3m/ui/options/utils/ControlCode.java | 55 ++++ .../com/dat3m/ui/utils/BoundListener.java | 45 --- .../java/com/dat3m/ui/utils/Selector.java | 28 -- .../main/java/com/dat3m/ui/utils/Utils.java | 2 +- 30 files changed, 660 insertions(+), 613 deletions(-) delete mode 100644 ui/src/main/java/com/dat3m/ui/editor/EditorPane.java create mode 100644 ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/IconPane.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/OptionsPane.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/Selector.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java delete mode 100644 ui/src/main/java/com/dat3m/ui/utils/BoundListener.java delete mode 100644 ui/src/main/java/com/dat3m/ui/utils/Selector.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index bd78e375d3..f8c31557db 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -85,7 +85,7 @@ public static void main(String[] args) throws IOException { throw new RuntimeException("Assert is required for Dartagnan tests"); } - Wmm mcm = new ParserCat().parse(cmd.getOptionValue("cat"), target); + Wmm mcm = new ParserCat().parseFile(cmd.getOptionValue("cat"), target); if(cmd.hasOption("draw")) { mcm.setDrawExecutionGraph(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 0a3295359f..f61aaa536e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -13,13 +13,19 @@ public class ParserCat { - public Wmm parse(String inputFilePath, Arch target) throws IOException { + public Wmm parseFile(String inputFilePath, Arch target) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + return parse(CharStreams.fromStream(stream), target); + } + + public Wmm parse(String raw, Arch target) { + return parse(CharStreams.fromString(raw), target); + } + + private Wmm parse(CharStream charStream, Arch target){ CatLexer lexer = new CatLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); CatParser parser = new CatParser(tokenStream); parser.setErrorHandler(new BailErrorStrategy()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java index 58b867b3c6..40a91ee631 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java @@ -1,10 +1,9 @@ package com.dat3m.dartagnan.parsers.program; import com.dat3m.dartagnan.program.Program; - -import java.io.IOException; +import org.antlr.v4.runtime.CharStream; public interface ParserInterface { - Program parse(String inputFilePath) throws IOException; + Program parse(CharStream charStream); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java index a668ed6539..01a5364744 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java @@ -10,20 +10,12 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusAArch64 implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + public Program parse(CharStream charStream) { LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); LitmusAArch64Parser parser = new LitmusAArch64Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -33,7 +25,6 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusAArch64 visitor = new VisitorLitmusAArch64(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.ARM8); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 3ea040fff6..5a1e8a48ec 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -9,20 +9,12 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusC implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + public Program parse(CharStream charStream) { LitmusCLexer lexer = new LitmusCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); LitmusCParser parser = new LitmusCParser(tokenStream); parser.setErrorHandler(new BailErrorStrategy()); @@ -31,7 +23,6 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusC visitor = new VisitorLitmusC(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.NONE); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java index 6549f6ac6d..a52572417c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java @@ -10,20 +10,12 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusPPC implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + public Program parse(CharStream charStream) { LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); LitmusPPCParser parser = new LitmusPPCParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -33,7 +25,6 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusPPC visitor = new VisitorLitmusPPC(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.POWER); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java index 71e647b489..32e27b9d8a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java @@ -10,20 +10,12 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusX86 implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + public Program parse(CharStream charStream) { LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); LitmusX86Parser parser = new LitmusX86Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -33,7 +25,6 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusX86 visitor = new VisitorLitmusX86(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.TSO); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java index f87ddbab72..9998e6feae 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java @@ -8,20 +8,12 @@ import com.dat3m.dartagnan.program.Program; import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserPorthos implements ParserInterface{ @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); + public Program parse(CharStream charStream) { PorthosLexer lexer = new PorthosLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - stream.close(); PorthosParser parser = new PorthosParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -30,8 +22,6 @@ public Program parse(String inputFilePath) throws IOException { ParserRuleContext parserEntryPoint = parser.main(); VisitorPorthos visitor = new VisitorPorthos(pb); - Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); - return program; + return (Program) parserEntryPoint.accept(visitor); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 8235de110f..fadb18a378 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -2,11 +2,10 @@ import com.dat3m.dartagnan.parsers.program.utils.ParsingException; import com.dat3m.dartagnan.program.Program; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; +import java.io.*; public class ProgramParser { @@ -16,26 +15,43 @@ public class ProgramParser { private static final String TYPE_LITMUS_C = "C"; public Program parse(String inputFilePath) throws IOException { - ParserInterface parser = null; + ParserInterface parser = getConcreteParser(inputFilePath); + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); + Program program = parser.parse(charStream); + stream.close(); + program.setName(inputFilePath); + return program; + } - if(inputFilePath.endsWith("pts")){ - parser = new ParserPorthos(); + public Program parse(String raw, String format) { + if(format.equals("pts")){ + return new ParserPorthos().parse(CharStreams.fromString(raw)); + } else if(format.equals("litmus")){ + return getConcreteLitmusParser(raw).parse(CharStreams.fromString(raw)); + } + throw new ParsingException("Unknown input file type"); + } + private ParserInterface getConcreteParser(String inputFilePath) throws IOException { + if(inputFilePath.endsWith("pts")){ + return new ParserPorthos(); } else if(inputFilePath.endsWith("litmus")){ - String header = readFirstLine(inputFilePath).toUpperCase(); - if(header.indexOf(TYPE_LITMUS_AARCH64) == 0){ - parser = new ParserLitmusAArch64(); - } else if(header.indexOf(TYPE_LITMUS_C) == 0){ - parser = new ParserLitmusC(); - } else if(header.indexOf(TYPE_LITMUS_PPC) == 0){ - parser = new ParserLitmusPPC(); - } else if(header.indexOf(TYPE_LITMUS_X86) == 0){ - parser = new ParserLitmusX86(); - } + return getConcreteLitmusParser(readFirstLine(inputFilePath).toUpperCase()); } + throw new ParsingException("Unknown input file type"); + } - if(parser != null){ - return parser.parse(inputFilePath); + private ParserInterface getConcreteLitmusParser(String programText){ + if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ + return new ParserLitmusAArch64(); + } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ + return new ParserLitmusC(); + } else if(programText.indexOf(TYPE_LITMUS_PPC) == 0){ + return new ParserLitmusPPC(); + } else if(programText.indexOf(TYPE_LITMUS_X86) == 0){ + return new ParserLitmusX86(); } throw new ParsingException("Unknown input file type"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java index ca014669b4..9f793a3bff 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java @@ -1,7 +1,7 @@ package com.dat3m.dartagnan.wmm.utils; public enum Arch { - NONE, ALPHA, ARM, ARM8, POWER, PSO, RMO, TSO; + NONE, ARM, ARM8, POWER, TSO; public static Arch get(String arch){ if(arch != null){ @@ -9,18 +9,12 @@ public static Arch get(String arch){ switch(arch){ case "none": return NONE; - case "alpha": - throw new UnsupportedOperationException("Unsupported architecture alpha"); case "arm": return ARM; case "arm8": return ARM8; case "power": return POWER; - case "pso": - throw new UnsupportedOperationException("Unsupported architecture pso"); - case "rmo": - throw new UnsupportedOperationException("Unsupported architecture rmo"); case "tso": return TSO; } @@ -30,11 +24,9 @@ public static Arch get(String arch){ public boolean getIncludePoToCtrl(){ switch(this) { - case ALPHA: case ARM: case ARM8: case POWER: - case RMO: return true; default: return false; @@ -46,18 +38,12 @@ public String toString() { switch(this){ case NONE: return "none"; - case ALPHA: - return "alpha"; case ARM: return "arm"; case ARM8: return "arm8"; case POWER: return "power"; - case PSO: - return "pso"; - case RMO: - return "rmo"; case TSO: return "tso"; } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java index 88966486e0..213b60d016 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java @@ -27,7 +27,7 @@ public abstract class AbstractDartagnanTest { static Iterable buildParameters(String litmusPath, String cat, Arch target, int unroll) throws IOException { int n = ResourceHelper.LITMUS_RESOURCE_PATH.length(); Map expectationMap = ResourceHelper.getExpectedResults(); - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + cat, target); + Wmm wmm = new ParserCat().parseFile(ResourceHelper.CAT_RESOURCE_PATH + cat, target); return Files.walk(Paths.get(ResourceHelper.LITMUS_RESOURCE_PATH + litmusPath)) .filter(Files::isRegularFile) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java index 679773efc7..ee82d4829e 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java @@ -27,7 +27,7 @@ public class DartagnanArrayValidTest { @Parameterized.Parameters(name = "{index}: {0}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); + Wmm wmm = new ParserCat().parseFile(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); return Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "arrays/ok/")) .filter(Files::isRegularFile) .filter(f -> (f.toString().endsWith("litmus"))) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java index 5f7d15e1f0..5ad0acad48 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java @@ -29,7 +29,7 @@ public class DartagnanBranchTest { @Parameterized.Parameters(name = "{index}: {0}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); + Wmm wmm = new ParserCat().parseFile(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); ImmutableMap expected = readExpectedResults(); return Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "branch/")) .filter(Files::isRegularFile) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java index d56e0dfc14..f05091e88d 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java @@ -34,7 +34,7 @@ public class DartagnanUnrollWhileTest { @Parameterized.Parameters(name = "{index}: {0} bound={2}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); + Wmm wmm = new ParserCat().parseFile(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat", Arch.NONE); String test1 = ResourceHelper.TEST_RESOURCE_PATH + "unroll/C-unroll-01.litmus"; String test2 = ResourceHelper.TEST_RESOURCE_PATH + "unroll/C-unroll-02.litmus"; diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index 75d41bf196..ab03b972ba 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -78,8 +78,8 @@ public static void main(String[] args) throws IOException { System.exit(0); return; } - Wmm mcmS = new ParserCat().parse(cmd.getOptionValue("scat"), source); - Wmm mcmT = new ParserCat().parse(cmd.getOptionValue("tcat"), target); + Wmm mcmS = new ParserCat().parseFile(cmd.getOptionValue("scat"), source); + Wmm mcmT = new ParserCat().parseFile(cmd.getOptionValue("tcat"), target); if(cmd.hasOption("draw")) { mcmS.setDrawExecutionGraph(); diff --git a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java index 80b8f61f44..2e7d72761c 100644 --- a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java +++ b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java @@ -28,10 +28,10 @@ public class PorthosTest { @Parameterized.Parameters(name = "{index}: {0} {2} -> {3} mode={7} unroll={6} alias=anderson") public static Iterable data() throws IOException { - Wmm wmmSc = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/sc.cat", Arch.NONE); - Wmm wmmTso = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/tso.cat", Arch.TSO); - Wmm wmmPpc = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/power.cat", Arch.POWER); - Wmm wmmArm = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/arm.cat", Arch.ARM); + Wmm wmmSc = new ParserCat().parseFile(CAT_RESOURCE_PATH + "cat/sc.cat", Arch.NONE); + Wmm wmmTso = new ParserCat().parseFile(CAT_RESOURCE_PATH + "cat/tso.cat", Arch.TSO); + Wmm wmmPpc = new ParserCat().parseFile(CAT_RESOURCE_PATH + "cat/power.cat", Arch.POWER); + Wmm wmmArm = new ParserCat().parseFile(CAT_RESOURCE_PATH + "cat/arm.cat", Arch.ARM); return Arrays.asList(new Object[][] { { BENCHMARKS_RESOURCE_PATH + "benchmarks/Bakery.pts", false, Arch.NONE, Arch.TSO, wmmSc, wmmTso, 2, Mode.KNASTER}, diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 74b920b4cd..a272cddfc5 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -1,60 +1,33 @@ package com.dat3m.ui; -import com.dat3m.dartagnan.Dartagnan; +import com.dat3m.dartagnan.parsers.cat.ParserCat; +import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; -import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.Wmm; -import com.dat3m.dartagnan.wmm.utils.Arch; -import com.dat3m.dartagnan.wmm.utils.Mode; -import com.dat3m.porthos.Porthos; -import com.dat3m.porthos.PorthosResult; -import com.dat3m.ui.editor.Editor; +import com.dat3m.ui.editor.EditorsPane; import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; import com.dat3m.ui.option.GraphOption; import com.dat3m.ui.option.Option; -import com.dat3m.ui.utils.*; -import com.microsoft.z3.Context; -import com.microsoft.z3.Solver; +import com.dat3m.ui.options.OptionsPane; +import com.dat3m.ui.options.utils.ControlCode; import javax.swing.*; -import javax.swing.border.TitledBorder; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import static java.awt.FlowLayout.LEFT; -import static java.awt.FlowLayout.RIGHT; import static javax.swing.BorderFactory.createEmptyBorder; -import static javax.swing.BorderFactory.createTitledBorder; -import static javax.swing.JOptionPane.INFORMATION_MESSAGE; -import static javax.swing.JOptionPane.showMessageDialog; -import static javax.swing.SwingUtilities.invokeLater; import static javax.swing.UIManager.getDefaults; -import static javax.swing.border.TitledBorder.CENTER; public class Dat3M extends JFrame implements ActionListener { - // All these panes are fields since they need to be updated by the listener - // TODO: Height must come from the pane with controls - private JLabel iconPane = new JLabel(IconHelper.getIcon(IconCode.DARTAGNAN, 300), JLabel.CENTER); - - // Options pane - private JTextPane consolePane; - private JTextField boundField; - private JPanel sArchPane; - private JPanel tArchPane; - private JButton graphButton; - private Option opt = new Option(Task.REACHABILITY, Arch.NONE, Arch.NONE, Mode.KNASTER, Alias.CFS, 1); - - // Execution witness - private GraphOption graph = new GraphOption(); - - private Editor editor; + private final OptionsPane optionsPane = new OptionsPane(); + private final EditorsPane editorsPane = new EditorsPane(); + private final GraphOption graph = new GraphOption(); private Dat3M() { - // Necessary to avoid horrible layout on splitPane getDefaults().put("SplitPane.border", createEmptyBorder()); setTitle("Dat3M"); @@ -63,98 +36,25 @@ private Dat3M() { setLayout(new BorderLayout()); setIconImage(IconHelper.getIcon(IconCode.DAT3M).getImage()); - editor = new Editor(); - setJMenuBar(editor.getMenuBar()); - - int width = Utils.getMainScreenWidth(); - Task[] tasks = { Task.REACHABILITY, Task.PORTABILITY }; - JPanel taskPane = new Selector(tasks, "Task", this); - - Arch[] archs = { Arch.NONE, Arch.TSO, Arch.POWER, Arch.ARM, Arch.ARM8 }; - tArchPane = new Selector(archs, "Target", this); - sArchPane = new Selector(archs, "Source", this); - sArchPane.setLayout(new FlowLayout(RIGHT)); - JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - archPane.setLeftComponent(tArchPane); - archPane.setRightComponent(sArchPane); - sArchPane.setEnabled(false); - archPane.setPreferredSize(new Dimension(300, 0)); - archPane.setDividerSize(0); - - Mode[] modes = { Mode.KNASTER, Mode.IDL, Mode.KLEENE }; - JPanel modePane = new Selector(modes, "Mode", this); - - Alias[] aliases = { Alias.NONE, Alias.CFIS, Alias.CFS }; - JPanel aliasPane = new Selector(aliases, "Alias", this); - - // Console. - consolePane = new JTextPane(); - consolePane.setEditable(false); - JScrollPane scrollConsole = new JScrollPane(consolePane); - scrollConsole.setMinimumSize(new Dimension(0, 120)); - scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - - // Graph button. - graphButton = new JButton("Execution Witness"); - graphButton.setMaximumSize(new Dimension(width, 50)); - graphButton.addActionListener(this); - graphButton.setEnabled(false); + JMenuBar menuBar = new JMenuBar(); + menuBar.add(editorsPane.getMenu()); + setJMenuBar(menuBar); + JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editorsPane.getMainPane()); + mainPane.setDividerSize(2); + add(mainPane); - // Bound editor - boundField = new JTextField(3); - boundField.setText("1"); - boundField.setActionCommand("Bound"); - boundField.addActionListener(this); - boundField.addKeyListener(new BoundListener(consolePane, graphButton, boundField, opt)); - JLabel uLabel = new JLabel("Unrolling Bound: "); - JPanel boundPane = new JPanel(new FlowLayout(LEFT)); - boundPane.add(uLabel); - boundPane.add(boundField); - - // Test button. - JButton testButton = new JButton("Test"); - testButton.setMaximumSize(new Dimension(width, 50)); - testButton.addActionListener(this); - - // Clear button. - JButton clearButton = new JButton("Clear"); - clearButton.setMaximumSize(new Dimension(width, 50)); - clearButton.addActionListener(this); + // EditorsPane needs to know is task is changed in order to show / hide source model editor + optionsPane.getTaskPane().addActionListener(editorsPane); - //Put the options in a split pane. - JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); - sp0.setDividerSize(2); - JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); - sp1.setDividerSize(2); - JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); - sp2.setDividerSize(2); - JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); - sp3.setDividerSize(2); - JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); - sp4.setDividerSize(2); - JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); - sp5.setDividerSize(2); - JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); - sp6.setDividerSize(2); - JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); - sp7.setDividerSize(2); - JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); - sp8.setDividerSize(2); + // ArchPane needs to know which program format has been loaded by editor in order to show / hide target + editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane.getArchManager()); - JPanel optionsPane = new JPanel(new GridLayout(1,0)); - TitledBorder titledBorder = createTitledBorder("Options"); - titledBorder.setTitleJustification(CENTER); - optionsPane.add(sp8); - optionsPane.setBorder(titledBorder); - //optionsPane.setMaximumSize(new Dimension(dartagnanIcon.getIconWidth(), 100)); + // Start listening to button events + optionsPane.getTestButton().addActionListener(this); + optionsPane.getClearButton().addActionListener(this); + optionsPane.getGraphButton().addActionListener(this); - //Put the editors in a split pane. - JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editor.getMainPane()); - mainPane.setDividerSize(2); - add(mainPane); - - //Display the window. pack(); } @@ -165,156 +65,32 @@ public static void main(String[] args) { }); } - @SuppressWarnings("unchecked") @Override - public void actionPerformed(ActionEvent e) { - - // The console and graph button are cleared after any change except opening the witness - if(!e.getActionCommand().equals("Execution Witness")) { - graphButton.setEnabled(false); - consolePane.setText(""); - } - - // The bound field cannot be empty - if(boundField.getText().equals("")) { - boundField.setText("1"); - } - - if(e.getActionCommand().equals("Task")) { - Object source = e.getSource(); - if(source instanceof JComboBox) { - opt.setTask((Task) ((JComboBox)source).getSelectedItem()); - switch(opt.getTask()){ - case REACHABILITY: - // Update image - // TODO: Height must come from the pane with controls - iconPane.setIcon(IconHelper.getIcon(IconCode.DARTAGNAN, 300)); - // Remove smmEditor - editor.setShowSourceMM(false); - break; - case PORTABILITY: - // Update image - // TODO: Height must come from the pane with controls - iconPane.setIcon(IconHelper.getIcon(IconCode.PORTHOS, 300)); - // Add smmEditor - editor.setShowSourceMM(true); - break; - } - } - } - - if(e.getActionCommand().equals("Target")) { - Object source = e.getSource(); - if(source instanceof JComboBox) { - opt.setTarget((Arch) ((JComboBox)source).getSelectedItem()); - } - } - - if(e.getActionCommand().equals("Source")) { - Object source = e.getSource(); - if(source instanceof JComboBox) { - opt.setSource((Arch) ((JComboBox)source).getSelectedItem()); - } - } - - if(e.getActionCommand().equals("Mode")) { - Object source = e.getSource(); - if(source instanceof JComboBox) { - opt.setMode((Mode) ((JComboBox)source).getSelectedItem()); - } - } - - if(e.getActionCommand().equals("Alias")) { - Object source = e.getSource(); - if(source instanceof JComboBox) { - opt.setAlias((Alias) ((JComboBox)source).getSelectedItem()); - } - } - - if(e.getActionCommand().equals("Test")) { - Program pSource = null; - Program pTarget = null; - Wmm smm = null; - Wmm tmm = null; - try { - pTarget = Utils.parseProgramEditor(editor.getEditor(EditorCode.PROGRAM), editor.getLoadedFormat(EditorCode.PROGRAM)); - } catch (Exception exp) { - showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); - return; - } - try { - tmm = Utils.parseMMEditor(editor.getEditor(EditorCode.TARGET_MM), opt.getTarget()); - } catch (Exception exp) { - String dummy = opt.getTask() == Task.REACHABILITY ? " " : " target "; - showMessageDialog(null, "The" + dummy + "memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); - return; - } - if(opt.getTask() == Task.PORTABILITY) { - if(!editor.getLoadedFormat(EditorCode.PROGRAM).equals("pts")) { - showMessageDialog(null, "Porthos only supports *.pts format", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); - return; - } - try { - pSource = Utils.parseProgramEditor(editor.getEditor(EditorCode.PROGRAM), editor.getLoadedFormat(EditorCode.PROGRAM)); - } catch (Exception exp) { - showMessageDialog(null, "The program was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); - return; - } - try { - smm = Utils.parseMMEditor(editor.getEditor(EditorCode.SOURCE_MM), opt.getSource()); - } catch (Exception exp) { - showMessageDialog(null, "The source memory model was not imported or cannot be parsed", "About", INFORMATION_MESSAGE, IconHelper.getIcon(IconCode.DAT3M)); - return; - } - } - - Context ctx = new Context(); - Solver solver = ctx.mkSolver(); - Solver solver2 = ctx.mkSolver(); + public void actionPerformed(ActionEvent event) { + String command = event.getActionCommand(); + if(ControlCode.TEST.actionCommand().equals(command)){ + runTest(); + } else if(ControlCode.CLEAR.actionCommand().equals(command)){ + System.out.println("I should clear. What should I clear?"); + // TODO: Implementation + } else if(ControlCode.GRAPH.actionCommand().equals(command)){ + // TODO: Implementation + EventQueue.invokeLater(graph::open); + } + } - String result = ""; + private void runTest(){ + Option option = optionsPane.getOption(); + if(option.validate()){ + // TODO: Implementation + String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); + String format = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); + Program program = new ProgramParser().parse(programText, format); - switch(opt.getTask()){ - case REACHABILITY: - result = "Condition " + pTarget.getAss().toStringWithType() + "\n"; - Arch target = pTarget.getArch() == null ? opt.getTarget() : pTarget.getArch(); - boolean isSat = Dartagnan.testProgram(solver, ctx, pTarget, tmm, target, opt.getBound(), opt.getMode(), opt.getAlias()); - result += isSat ? "OK" : "No"; - if(Dartagnan.canDrawGraph(pTarget.getAss(), isSat)) { - graphButton.setEnabled(true); - graph.generate(solver, ctx, pTarget); - } else { - graphButton.setEnabled(false); - } - break; - case PORTABILITY: - PorthosResult res = Porthos.testProgram(solver, solver2, ctx, pSource, pTarget, opt.getSource(), opt.getTarget(), smm, tmm, opt.getBound(), opt.getMode(), opt.getAlias()); - String dummy = res.getIsPortable()? " " : " not "; - result = "The program is" + dummy + "state-portable \nIterations: " + res.getIterations(); - if(!res.getIsPortable()) { - graphButton.setEnabled(true); - graph.generate(solver, ctx, res); - } else { - graphButton.setEnabled(false); - } - break; - } - consolePane.setText(result); - ctx.close(); - } - if(e.getActionCommand().equals("Execution Witness")) { - invokeLater(new Runnable() {public void run() {graph.open();}}); - } + String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); + Wmm targetModel = new ParserCat().parse(targetModelRaw, option.getTarget()); - // We update the task selectors - tArchPane.setEnabled(false); - sArchPane.setEnabled(false); - if(!editor.getLoadedFormat(EditorCode.PROGRAM).equals("litmus")) { - tArchPane.setEnabled(true); - if(opt.getTask().equals(Task.PORTABILITY)) { - sArchPane.setEnabled(true); - } } } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index 29d8d35634..a1e5ba3786 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -1,69 +1,113 @@ package com.dat3m.ui.editor; -import com.google.common.collect.ImmutableMap; +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.icon.IconHelper; +import com.google.common.collect.ImmutableSet; import javax.swing.*; import javax.swing.border.TitledBorder; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; -public class Editor { +import static java.lang.System.getProperty; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.JFileChooser.APPROVE_OPTION; - private final ImmutableMap editorPanes = ImmutableMap.of( - EditorCode.PROGRAM, new EditorPane(EditorCode.PROGRAM, new JEditorPane(), "litmus", "pts"), - EditorCode.SOURCE_MM, new EditorPane(EditorCode.SOURCE_MM, new JEditorPane(), "cat"), - EditorCode.TARGET_MM, new EditorPane(EditorCode.TARGET_MM, new JEditorPane(), "cat") - ); +public class Editor extends JScrollPane implements ActionListener { - private final JMenu menu; - private final JMenuBar menuBar; + private final EditorCode code; - private final JSplitPane mmPane; - private final JSplitPane mainPane; + private final JEditorPane editorPane; + private final JMenuItem menuItem; + private final JFileChooser chooser; + private final ImmutableSet allowedFormats; + private String loadedFormat = ""; - public Editor(){ - menu = new JMenu("Import"); - menu.add(editorPanes.get(EditorCode.PROGRAM).getMenuItem()); - menu.add(editorPanes.get(EditorCode.TARGET_MM).getMenuItem()); - this.menuBar = new JMenuBar(); - menuBar.add(menu); + private Set actionListeners = new HashSet<>(); - mmPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - mmPane.setBottomComponent(editorPanes.get(EditorCode.TARGET_MM)); - mmPane.setOneTouchExpandable(true); - mmPane.setDividerSize(0); - mmPane.setBorder(new TitledBorder("")); + Editor(EditorCode code, JEditorPane editorPane, String... formats){ + super(editorPane); + this.code = code; + this.editorPane = editorPane; + this.menuItem = new JMenuItem(code.toString()); + menuItem.setActionCommand(code.editorMenuActionCommand()); + menuItem.addActionListener(this); - mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, editorPanes.get(EditorCode.PROGRAM), mmPane); - mainPane.setOneTouchExpandable(true); - mainPane.setDividerSize(2); - mainPane.setDividerLocation(0.5); - mainPane.setBorder(new TitledBorder("")); + this.allowedFormats = ImmutableSet.copyOf(Arrays.asList(formats)); + this.chooser = new JFileChooser(); + for(String format : allowedFormats) { + chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + format, format)); + } + + setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + TitledBorder border = createTitledBorder(code.toString()); + border.setTitleJustification(TitledBorder.CENTER); + setBorder(border); } - public JMenuBar getMenuBar(){ - return menuBar; + public void addActionListener(ActionListener actionListener){ + actionListeners.add(actionListener); } - public JSplitPane getMainPane(){ - return mainPane; + public String getLoadedFormat(){ + return loadedFormat; } - public JEditorPane getEditor(EditorCode code){ - return editorPanes.get(code).getEditor(); + public String getText(){ + return editorPane.getText(); + } + + @Override + public void actionPerformed(ActionEvent event) { + if(code.editorMenuActionCommand().equals(event.getActionCommand())){ + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + int result = chooser.showOpenDialog(null); + if(result == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + String format = path.substring(path.lastIndexOf('.') + 1).trim(); + if(allowedFormats.contains(format)){ + loadedFormat = format; + notifyListeners(); + try { + editorPane.read(new InputStreamReader(new FileInputStream(path)), null); + } catch (IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog( + null, + "Error reading input file", + "Error", + JOptionPane.ERROR_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M)); + } + } else { + JOptionPane.showMessageDialog( + null, + "Please select a *." + String.join(", *.", allowedFormats) + " file", + "Invalid file format", + JOptionPane.INFORMATION_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M)); + } + } + } } - public String getLoadedFormat(EditorCode code){ - return editorPanes.get(code).getLoadedFormat(); + JMenuItem getMenuItem(){ + return menuItem; } - public void setShowSourceMM(boolean flag){ - if(flag){ - mmPane.setTopComponent(editorPanes.get(EditorCode.SOURCE_MM)); - mmPane.setDividerLocation(0.5); - menu.add(editorPanes.get(EditorCode.SOURCE_MM).getMenuItem(), 1); - } else { - mmPane.remove(editorPanes.get(EditorCode.SOURCE_MM)); - menu.remove(editorPanes.get(EditorCode.SOURCE_MM).getMenuItem()); + private void notifyListeners(){ + ActionEvent dataLoadedEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, code.editorActionCommand()); + for(ActionListener actionListener : actionListeners){ + actionListener.actionPerformed(dataLoadedEvent); } } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java index 634affd825..1a58e397a7 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java @@ -16,4 +16,28 @@ public String toString(){ } return super.toString(); } + + public String editorMenuActionCommand(){ + switch(this){ + case PROGRAM: + return "editor_menu_action_program"; + case SOURCE_MM: + return "editor_menu_action_source_mm"; + case TARGET_MM: + return "editor_menu_action_target_mm"; + } + throw new RuntimeException("Illegal EditorCode"); + } + + public String editorActionCommand(){ + switch(this){ + case PROGRAM: + return "editor_action_program"; + case SOURCE_MM: + return "editor_action_source_mm"; + case TARGET_MM: + return "editor_action_target_mm"; + } + throw new RuntimeException("Illegal EditorCode"); + } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java deleted file mode 100644 index d56b249364..0000000000 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorPane.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.dat3m.ui.editor; - -import com.dat3m.ui.icon.IconCode; -import com.dat3m.ui.icon.IconHelper; -import com.google.common.collect.ImmutableSet; - -import javax.swing.*; -import javax.swing.border.TitledBorder; -import javax.swing.filechooser.FileNameExtensionFilter; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; - -import static java.lang.System.getProperty; -import static javax.swing.BorderFactory.createTitledBorder; -import static javax.swing.JFileChooser.APPROVE_OPTION; - -public class EditorPane extends JScrollPane implements ActionListener { - - private final JEditorPane editorPane; - private final JMenuItem menuItem; - private final JFileChooser chooser; - private final ImmutableSet allowedFormats; - - private String loadedFormat = ""; - - EditorPane(EditorCode code, JEditorPane editorPane, String... formats){ - super(editorPane); - this.editorPane = editorPane; - this.menuItem = new JMenuItem(code.toString()); - menuItem.addActionListener(this); - - this.allowedFormats = ImmutableSet.copyOf(Arrays.asList(formats)); - this.chooser = new JFileChooser(); - for(String format : allowedFormats) { - chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + format, format)); - } - - setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - - TitledBorder border = createTitledBorder(code.toString()); - border.setTitleJustification(TitledBorder.CENTER); - setBorder(border); - } - - JEditorPane getEditor(){ - return editorPane; - } - - JMenuItem getMenuItem(){ - return menuItem; - } - - String getLoadedFormat(){ - return loadedFormat; - } - - @Override - public void actionPerformed(ActionEvent event) { - Object source = event.getSource(); - if(source instanceof JMenuItem){ - chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - int result = chooser.showOpenDialog(null); - if(result == APPROVE_OPTION){ - String path = chooser.getSelectedFile().getPath(); - loadedFormat = path.substring(path.lastIndexOf('.') + 1).trim(); - - if(allowedFormats.contains(loadedFormat)){ - try { - editorPane.read(new InputStreamReader(new FileInputStream(path)), null); - } catch (IOException e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - null, - "Error reading input file", - "Error", - JOptionPane.ERROR_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M)); - } - } else { - JOptionPane.showMessageDialog( - null, - "Please select a *." + String.join(", *.", allowedFormats) + " file", - "Invalid file format", - JOptionPane.INFORMATION_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M)); - } - } - } - } -} diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java new file mode 100644 index 0000000000..f73b158e62 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -0,0 +1,68 @@ +package com.dat3m.ui.editor; + +import com.dat3m.ui.options.utils.ControlCode; +import com.dat3m.ui.utils.Task; +import com.google.common.collect.ImmutableMap; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class EditorsPane implements ActionListener { + + private final ImmutableMap editors = ImmutableMap.of( + EditorCode.PROGRAM, new Editor(EditorCode.PROGRAM, new JEditorPane(), "litmus", "pts"), + EditorCode.SOURCE_MM, new Editor(EditorCode.SOURCE_MM, new JEditorPane(), "cat"), + EditorCode.TARGET_MM, new Editor(EditorCode.TARGET_MM, new JEditorPane(), "cat") + ); + + private final JSplitPane mmPane; + private final JSplitPane mainPane; + private final JMenu menu; + + public EditorsPane(){ + menu = new JMenu("Import"); + menu.add(editors.get(EditorCode.PROGRAM).getMenuItem()); + menu.add(editors.get(EditorCode.TARGET_MM).getMenuItem()); + + mmPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + mmPane.setBottomComponent(editors.get(EditorCode.TARGET_MM)); + mmPane.setOneTouchExpandable(true); + mmPane.setDividerSize(0); + mmPane.setBorder(new TitledBorder("")); + + mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, editors.get(EditorCode.PROGRAM), mmPane); + mainPane.setOneTouchExpandable(true); + mainPane.setDividerSize(2); + mainPane.setDividerLocation(0.5); + mainPane.setBorder(new TitledBorder("")); + } + + public JMenu getMenu(){ + return menu; + } + + public JSplitPane getMainPane(){ + return mainPane; + } + + public Editor getEditor(EditorCode code){ + return editors.get(code); + } + + @Override + public void actionPerformed(ActionEvent event) { + if(ControlCode.TASK.actionCommand().equals(event.getActionCommand())){ + JComboBox selector = (JComboBox)event.getSource(); + if(selector.getModel().getSelectedItem().equals(Task.PORTABILITY)){ + mmPane.setTopComponent(editors.get(EditorCode.SOURCE_MM)); + mmPane.setDividerLocation(0.5); + menu.add(editors.get(EditorCode.SOURCE_MM).getMenuItem(), 1); + } else { + mmPane.remove(editors.get(EditorCode.SOURCE_MM)); + menu.remove(editors.get(EditorCode.SOURCE_MM).getMenuItem()); + } + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/option/Option.java index a25d2a75ef..411030b241 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/option/Option.java @@ -7,12 +7,12 @@ public class Option { - private Task task; - private Arch target; - private Arch source; - private Mode mode; - private Alias alias; - private int bound; + private final Task task; + private final Arch target; + private final Arch source; + private final Mode mode; + private final Alias alias; + private final int bound; public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { this.task = task; @@ -26,48 +26,34 @@ public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int public Task getTask() { return task; } - - public void setTask(Task task) { - this.task = task; - } public Arch getTarget() { return target; } - - public void setTarget(Arch target) { - this.target = target; - } public Arch getSource() { return source; } - - public void setSource(Arch source) { - this.source = source; - } public Mode getMode() { return mode; } - - public void setMode(Mode mode) { - this.mode = mode; - } public Alias getAlias() { return alias; } - - public void setAlias(Alias alias) { - this.alias = alias; - } public int getBound() { return bound; } - - public void setBound(int bound) { - this.bound = bound; - } + + // TODO: Implementation + public boolean validate(){ + boolean somethingIsWrong = false; + if(somethingIsWrong){ + // TODO: Show alert with what is wrong + return false; + } + return true; + } } diff --git a/ui/src/main/java/com/dat3m/ui/options/IconPane.java b/ui/src/main/java/com/dat3m/ui/options/IconPane.java new file mode 100644 index 0000000000..98f89bbfd7 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/IconPane.java @@ -0,0 +1,32 @@ +package com.dat3m.ui.options; + +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.icon.IconHelper; +import com.dat3m.ui.utils.Task; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class IconPane extends JLabel implements ActionListener { + + private int height; + + IconPane(IconCode code, int height, int horizontalAlignment){ + super(IconHelper.getIcon(code, height), horizontalAlignment); + this.height = height; + } + + @Override + public void actionPerformed(ActionEvent event) { + Object source = event.getSource(); + if(source instanceof JComboBox){ + JComboBox selector = (JComboBox)source; + if(selector.getModel().getSelectedItem().equals(Task.PORTABILITY)){ + setIcon(IconHelper.getIcon(IconCode.PORTHOS, height)); + } else { + setIcon(IconHelper.getIcon(IconCode.DARTAGNAN, height)); + } + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java new file mode 100644 index 0000000000..4af063d6c7 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -0,0 +1,193 @@ +package com.dat3m.ui.options; + +import com.dat3m.dartagnan.program.utils.Alias; +import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.option.Option; +import com.dat3m.ui.options.utils.ArchManager; +import com.dat3m.ui.options.utils.ControlCode; +import com.dat3m.ui.utils.Task; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.util.EnumSet; + +import static java.awt.FlowLayout.LEFT; +import static javax.swing.BorderFactory.createTitledBorder; +import static javax.swing.border.TitledBorder.CENTER; + +public class OptionsPane extends JPanel { + + private final IconPane iconPane; + + private final Selector taskPane; + private final Selector modePane; + private final Selector aliasPane; + + private final Selector sourcePane; + private final Selector targetPane; + + private final JTextField boundField; + + private final JButton testButton; + private final JButton clearButton; + private final JButton graphButton; + + private final JTextPane consolePane; + + private final ArchManager archManager; + + + public OptionsPane(){ + super(new GridLayout(1,0)); + + iconPane = new IconPane(IconCode.DARTAGNAN, getIconHeight(), JLabel.CENTER); + + taskPane = new Selector<>(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); + modePane = new Selector<>(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); + aliasPane = new Selector<>(EnumSet.allOf(Alias.class).toArray(new Alias[0]), ControlCode.ALIAS); + + Arch[] architectures = EnumSet.allOf(Arch.class).toArray(new Arch[0]); + sourcePane = new Selector<>(architectures, ControlCode.SOURCE); + targetPane = new Selector<>(architectures, ControlCode.TARGET); + sourcePane.setEnabled(false); + archManager = new ArchManager(sourcePane, targetPane); + + // TODO: New class with a field which forbids illegal values + boundField = new JTextField("1", 3); + boundField.setActionCommand(ControlCode.BOUND.actionCommand()); + + testButton = new JButton("Test"); + testButton.setActionCommand(ControlCode.TEST.actionCommand()); + + clearButton = new JButton("Clear"); + clearButton.setActionCommand(ControlCode.CLEAR.actionCommand()); + + graphButton = new JButton("Execution Witness"); + graphButton.setActionCommand(ControlCode.GRAPH.actionCommand()); + graphButton.setEnabled(false); + + consolePane = new JTextPane(); + consolePane.setEditable(false); + + bindListeners(); + mkGrid(); + } + + private void bindListeners(){ + taskPane.addActionListener(archManager); + taskPane.addActionListener(iconPane); + } + + public Selector getTaskPane(){ + return taskPane; + } + + public ArchManager getArchManager(){ + return archManager; + } + + public JButton getTestButton(){ + return testButton; + } + + public JButton getClearButton(){ + return clearButton; + } + + public JButton getGraphButton(){ + return graphButton; + } + + public Option getOption(){ + return new Option( + (Task)taskPane.getSelectedItem(), + (Arch)targetPane.getSelectedItem(), + (Arch)sourcePane.getSelectedItem(), + (Mode)modePane.getSelectedItem(), + (Alias)aliasPane.getSelectedItem(), + // TODO: Handle possible exceptions in the new boundField class + Integer.parseInt(boundField.getText()) + ); + } + + // TODO: Implementation + private int getIconHeight(){ + return 300; + } + + // TODO: Refactoring + private void mkGrid(){ + int width = 300; + + // Dimensions + testButton.setMaximumSize(new Dimension(width, 50)); + clearButton.setMaximumSize(new Dimension(width, 50)); + graphButton.setMaximumSize(new Dimension(width, 50)); + + JScrollPane scrollConsole = new JScrollPane(consolePane); + scrollConsole.setMaximumSize(new Dimension(width, 120)); + scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + JLabel uLabel = new JLabel("Unrolling Bound: "); + JPanel boundPane = new JPanel(new FlowLayout(LEFT)); + boundPane.add(uLabel); + boundPane.add(boundField); + + JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + archPane.setLeftComponent(sourcePane); + archPane.setRightComponent(targetPane); + archPane.setPreferredSize(new Dimension(300, 0)); + archPane.setDividerSize(0); + + //Put the options in a split pane. + JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); + sp0.setDividerSize(2); + JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); + sp1.setDividerSize(2); + JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); + sp2.setDividerSize(2); + JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); + sp3.setDividerSize(2); + JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); + sp4.setDividerSize(2); + JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); + sp5.setDividerSize(2); + JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); + sp6.setDividerSize(2); + JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); + sp7.setDividerSize(2); + JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); + sp8.setDividerSize(2); + add(sp8); + + // Inner borders + Border emptyBorder = BorderFactory.createEmptyBorder(); + + iconPane.setBorder(emptyBorder); + taskPane.setBorder(emptyBorder); + modePane.setBorder(emptyBorder); + aliasPane.setBorder(emptyBorder); + archPane.setBorder(emptyBorder); + sourcePane.setBorder(emptyBorder); + taskPane.setBorder(emptyBorder); + + sp0.setBorder(emptyBorder); + sp1.setBorder(emptyBorder); + sp2.setBorder(emptyBorder); + sp3.setBorder(emptyBorder); + sp4.setBorder(emptyBorder); + sp5.setBorder(emptyBorder); + sp6.setBorder(emptyBorder); + sp7.setBorder(emptyBorder); + sp8.setBorder(emptyBorder); + + // Outer border + TitledBorder titledBorder = createTitledBorder("Options"); + titledBorder.setTitleJustification(CENTER); + setBorder(titledBorder); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/Selector.java b/ui/src/main/java/com/dat3m/ui/options/Selector.java new file mode 100644 index 0000000000..95dfeb69e7 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/Selector.java @@ -0,0 +1,34 @@ +package com.dat3m.ui.options; + +import com.dat3m.ui.options.utils.ControlCode; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; + +public class Selector extends JPanel { + + private JComboBox selector; + + Selector(T[] options, ControlCode code) { + selector = new JComboBox<>(options); + selector.setActionCommand(code.actionCommand()); + this.setLayout(new FlowLayout(FlowLayout.LEFT)); + this.add(new JLabel(code.toString() + ": ")); + this.add(selector); + } + + @Override + public void setEnabled(boolean flag) { + selector.setEnabled(flag); + } + + public void addActionListener(ActionListener listener){ + selector.addActionListener(listener); + } + + Object getSelectedItem(){ + return selector.getSelectedItem(); + } +} + diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java new file mode 100644 index 0000000000..dcad77923c --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java @@ -0,0 +1,43 @@ +package com.dat3m.ui.options.utils; + +import com.dat3m.ui.editor.Editor; +import com.dat3m.ui.editor.EditorCode; +import com.dat3m.ui.options.Selector; +import com.dat3m.ui.utils.Task; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ArchManager implements ActionListener { + + private Selector sourceSelector; + private Selector targetSelector; + + private boolean isEnabled = true; + private boolean isSourceEnabled = false; + + public ArchManager(Selector sourceSelector, Selector targetSelector){ + this.targetSelector = targetSelector; + this.sourceSelector = sourceSelector; + } + + @Override + public void actionPerformed(ActionEvent event) { + String command = event.getActionCommand(); + if(EditorCode.PROGRAM.editorActionCommand().equals(command)){ + Editor editor = (Editor)event.getSource(); + isEnabled = !editor.getLoadedFormat().equals("litmus"); + updatedPanes(); + } else if(ControlCode.TASK.actionCommand().equals(command)){ + JComboBox selector = (JComboBox)event.getSource(); + isSourceEnabled = selector.getModel().getSelectedItem().equals(Task.PORTABILITY); + updatedPanes(); + } + } + + private void updatedPanes(){ + targetSelector.setEnabled(isEnabled); + sourceSelector.setEnabled(isEnabled && isSourceEnabled); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java new file mode 100644 index 0000000000..b1594c29b1 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java @@ -0,0 +1,55 @@ +package com.dat3m.ui.options.utils; + +public enum ControlCode { + + TASK, SOURCE, TARGET, MODE, ALIAS, BOUND, TEST, CLEAR, GRAPH; + + @Override + public String toString(){ + switch(this){ + case TASK: + return "Task"; + case SOURCE: + return "Source"; + case TARGET: + return "Target"; + case MODE: + return "Mode"; + case ALIAS: + return "Alias"; + case BOUND: + return "Bound"; + case TEST: + return "Test"; + case CLEAR: + return "Clear"; + case GRAPH: + return "Graph"; + } + return super.toString(); + } + + public String actionCommand(){ + switch(this){ + case TASK: + return "control_command_task"; + case SOURCE: + return "control_command_source"; + case TARGET: + return "control_command_target"; + case MODE: + return "control_command_mode"; + case ALIAS: + return "control_command_alias"; + case BOUND: + return "control_command_bound"; + case TEST: + return "control_command_test"; + case CLEAR: + return "control_command_clear"; + case GRAPH: + return "control_command_graph"; + } + throw new RuntimeException("Illegal EditorCode"); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java b/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java deleted file mode 100644 index 9e9a465c82..0000000000 --- a/ui/src/main/java/com/dat3m/ui/utils/BoundListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dat3m.ui.utils; - -import com.dat3m.ui.option.Option; - -import javax.swing.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class BoundListener implements KeyListener { - - private JTextPane consolePane; - private JButton graphButton; - private JTextField boundField; - private Option option; - - public BoundListener(JTextPane consolePane, JButton graphButton, JTextField boundField, Option option){ - this.consolePane = checkNotNull(consolePane); - this.graphButton = checkNotNull(graphButton); - this.boundField = checkNotNull(boundField); - this.option = checkNotNull(option); - } - - @Override - public void keyTyped(KeyEvent event) { - // Nothing to do here - } - - @Override - public void keyPressed(KeyEvent arg0) { - // Nothing to do here - } - - @Override - public void keyReleased(KeyEvent arg0) { - try { - consolePane.setText(""); - graphButton.setEnabled(false); - option.setBound(Integer.parseInt(boundField.getText())); - } catch (Exception e) { - // Nothing to do here - } - } -} diff --git a/ui/src/main/java/com/dat3m/ui/utils/Selector.java b/ui/src/main/java/com/dat3m/ui/utils/Selector.java deleted file mode 100644 index e13b594bf2..0000000000 --- a/ui/src/main/java/com/dat3m/ui/utils/Selector.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dat3m.ui.utils; - -import java.awt.FlowLayout; -import java.awt.event.ActionListener; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - -public class Selector extends JPanel { - - private JComboBox selector; - - public Selector(Object[] options, String label, ActionListener caller) { - selector = new JComboBox<>(options); - selector.setActionCommand(label); - selector.addActionListener(caller); - JLabel sLabel = new JLabel(label + ": "); - this.setLayout(new FlowLayout(FlowLayout.LEFT)); - this.add(sLabel); - this.add(selector); - } - - @Override - public void setEnabled(boolean b) { - selector.setEnabled(b); - } -} diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 1ececc5c7d..210da8c038 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -31,7 +31,7 @@ public static Program parseProgramEditor(JEditorPane editor, String loadedFormat public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOException { File tmpMMFile = createTmpFile(editor, TMPMMPATH); - Wmm mm = new ParserCat().parse(TMPMMPATH, target); + Wmm mm = new ParserCat().parseFile(TMPMMPATH, target); tmpMMFile.delete(); return mm; } From 740da45bc3a6fb3f02bae74b999fa7db16ae8773 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 8 Mar 2019 18:58:08 +0200 Subject: [PATCH 056/145] More refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 66 +++++++++++++++---- .../ui/{option => graph}/GraphOption.java | 2 +- .../Option.java => options/Options.java} | 6 +- .../com/dat3m/ui/options/OptionsPane.java | 9 ++- .../java/com/dat3m/ui/result/Dat3mResult.java | 10 +++ .../dat3m/ui/result/PortabilityResult.java | 57 ++++++++++++++++ .../dat3m/ui/result/ReachabilityResult.java | 61 +++++++++++++++++ 7 files changed, 191 insertions(+), 20 deletions(-) rename ui/src/main/java/com/dat3m/ui/{option => graph}/GraphOption.java (98%) rename ui/src/main/java/com/dat3m/ui/{option/Option.java => options/Options.java} (89%) create mode 100644 ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java create mode 100644 ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java create mode 100644 ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a272cddfc5..56fa99540d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -8,10 +8,14 @@ import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; -import com.dat3m.ui.option.GraphOption; -import com.dat3m.ui.option.Option; +import com.dat3m.ui.graph.GraphOption; +import com.dat3m.ui.options.Options; import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.options.utils.ControlCode; +import com.dat3m.ui.result.Dat3mResult; +import com.dat3m.ui.result.PortabilityResult; +import com.dat3m.ui.result.ReachabilityResult; +import com.dat3m.ui.utils.Task; import javax.swing.*; import java.awt.*; @@ -27,6 +31,8 @@ public class Dat3M extends JFrame implements ActionListener { private final EditorsPane editorsPane = new EditorsPane(); private final GraphOption graph = new GraphOption(); + private Dat3mResult testResult; + private Dat3M() { getDefaults().put("SplitPane.border", createEmptyBorder()); @@ -70,6 +76,11 @@ public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if(ControlCode.TEST.actionCommand().equals(command)){ runTest(); + if(testResult != null){ + optionsPane.getConsolePane().setText(testResult.getVerdict()); + optionsPane.getGraphButton().setEnabled(testResult.getGraph() != null); + } + } else if(ControlCode.CLEAR.actionCommand().equals(command)){ System.out.println("I should clear. What should I clear?"); // TODO: Implementation @@ -80,17 +91,46 @@ public void actionPerformed(ActionEvent event) { } private void runTest(){ - Option option = optionsPane.getOption(); - if(option.validate()){ - // TODO: Implementation - String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); - String format = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); - Program program = new ProgramParser().parse(programText, format); - - - String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); - Wmm targetModel = new ParserCat().parse(targetModelRaw, option.getTarget()); - + Options options = optionsPane.getOptions(); + if(options.validate()){ + testResult = null; + try { + String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); + String format = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); + Program program = new ProgramParser().parse(programText, format); + try { + String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); + Wmm targetModel = new ParserCat().parse(targetModelRaw, options.getTarget()); + if(options.getTask() == Task.REACHABILITY){ + testResult = new ReachabilityResult(program, targetModel, options); + + } else { + try { + Program sourceProgram = new ProgramParser().parse(programText, format); + String sourceModelRaw = editorsPane.getEditor(EditorCode.SOURCE_MM).getText(); + Wmm sourceModel = new ParserCat().parse(sourceModelRaw, options.getSource()); + testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); + + } catch (Exception e){ + showError("The source memory model was not imported or cannot be parsed"); + } + } + } catch (Exception e){ + e.printStackTrace(); + showError("The target memory model was not imported or cannot be parsed"); + } + } catch (Exception e){ + showError("The program was not imported or cannot be parsed"); + } } } + + private void showError(String msg){ + JOptionPane.showMessageDialog( + null, + msg, + "Error", + JOptionPane.ERROR_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M)); + } } diff --git a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java similarity index 98% rename from ui/src/main/java/com/dat3m/ui/option/GraphOption.java rename to ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 7ab9f4dafc..c5d408d2f6 100644 --- a/ui/src/main/java/com/dat3m/ui/option/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.option; +package com.dat3m.ui.graph; import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; diff --git a/ui/src/main/java/com/dat3m/ui/option/Option.java b/ui/src/main/java/com/dat3m/ui/options/Options.java similarity index 89% rename from ui/src/main/java/com/dat3m/ui/option/Option.java rename to ui/src/main/java/com/dat3m/ui/options/Options.java index 411030b241..924ee0d761 100644 --- a/ui/src/main/java/com/dat3m/ui/option/Option.java +++ b/ui/src/main/java/com/dat3m/ui/options/Options.java @@ -1,11 +1,11 @@ -package com.dat3m.ui.option; +package com.dat3m.ui.options; import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.ui.utils.Task; -public class Option { +public class Options { private final Task task; private final Arch target; @@ -14,7 +14,7 @@ public class Option { private final Alias alias; private final int bound; - public Option (Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { + public Options(Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { this.task = task; this.source = source; this.target = target; diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 4af063d6c7..d2ceda15c8 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -4,7 +4,6 @@ import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.ui.icon.IconCode; -import com.dat3m.ui.option.Option; import com.dat3m.ui.options.utils.ArchManager; import com.dat3m.ui.options.utils.ControlCode; import com.dat3m.ui.utils.Task; @@ -102,8 +101,12 @@ public JButton getGraphButton(){ return graphButton; } - public Option getOption(){ - return new Option( + public JTextPane getConsolePane(){ + return consolePane; + } + + public Options getOptions(){ + return new Options( (Task)taskPane.getSelectedItem(), (Arch)targetPane.getSelectedItem(), (Arch)sourcePane.getSelectedItem(), diff --git a/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java new file mode 100644 index 0000000000..6054287c59 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java @@ -0,0 +1,10 @@ +package com.dat3m.ui.result; + +import com.dat3m.dartagnan.utils.Graph; + +public interface Dat3mResult { + + String getVerdict(); + + Graph getGraph(); +} diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java new file mode 100644 index 0000000000..8e7e505b14 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -0,0 +1,57 @@ +package com.dat3m.ui.result; + +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.utils.Graph; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.porthos.Porthos; +import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.options.Options; +import com.microsoft.z3.Context; +import com.microsoft.z3.Solver; + +public class PortabilityResult implements Dat3mResult { + + private final Program sourceProgram; + private final Program targetProgram; + private final Wmm sourceWmm; + private final Wmm targetWmm; + private final Options options; + + private Graph graph; + private String verdict; + + public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourceWmm, Wmm targetWmm, Options options){ + this.sourceProgram = sourceProgram; + this.targetProgram = targetProgram; + this.sourceWmm = sourceWmm; + this.targetWmm = targetWmm; + this.options = options; + run(); + } + + public Graph getGraph(){ + return graph; + } + + public String getVerdict(){ + return verdict; + } + + private void run(){ + Context ctx = new Context(); + Solver s1 = ctx.mkSolver(); + Solver s2 = ctx.mkSolver(); + + PorthosResult result = Porthos.testProgram(s1, s2, ctx, sourceProgram, targetProgram, options.getSource(), + options.getTarget(), sourceWmm, targetWmm, options.getBound(), options.getMode(), options.getAlias()); + + verdict = "The program is" + (result.getIsPortable() ? " " : " not ") + "state-portable\n" + + "Iterations: " + result.getIterations(); + + if(!result.getIsPortable()){ + graph = new Graph(s1.getModel(), ctx); + graph.build(sourceProgram, targetProgram); + } + ctx.close(); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java new file mode 100644 index 0000000000..c80d034712 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -0,0 +1,61 @@ +package com.dat3m.ui.result; + +import com.dat3m.dartagnan.Dartagnan; +import com.dat3m.dartagnan.program.Program; +import com.dat3m.dartagnan.utils.Graph; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.ui.options.Options; +import com.microsoft.z3.Context; +import com.microsoft.z3.Solver; + +public class ReachabilityResult implements Dat3mResult { + + private final Program program; + private final Wmm wmm; + private final Options options; + + private Graph graph; + private String verdict; + + public ReachabilityResult(Program program, Wmm wmm, Options options){ + this.program = program; + this.wmm = wmm; + this.options = options; + run(); + } + + public Graph getGraph(){ + return graph; + } + + public String getVerdict(){ + return verdict; + } + + private void run(){ + Context ctx = new Context(); + Solver solver = ctx.mkSolver(); + Arch target = program.getArch() == null ? options.getTarget() : program.getArch(); + boolean result = Dartagnan.testProgram(solver, ctx, program, wmm, target, options.getBound(), + options.getMode(), options.getAlias()); + + buildVerdict(result); + + if(Dartagnan.canDrawGraph(program.getAss(), result)){ + graph = new Graph(solver.getModel(), ctx); + graph.build(program); + } + ctx.close(); + } + + private void buildVerdict(boolean result){ + StringBuilder sb = new StringBuilder(); + if(program.getAssFilter() != null){ + sb.append("Filter ").append(program.getAssFilter()); + } + sb.append("Condition ").append(program.getAss().toStringWithType()).append("\n"); + sb.append(result ? "OK" : "No").append("\n"); + verdict = sb.toString(); + } +} From 18e9fbcb125550fb78ce746035e8a38cecbfd2cd Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 13 Mar 2019 14:02:13 +0100 Subject: [PATCH 057/145] Added types to selectors --- .../com/dat3m/ui/options/OptionsPane.java | 20 +++++++++---------- .../dat3m/ui/options/utils/ArchManager.java | 7 ++++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index d2ceda15c8..63faba6452 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -23,11 +23,11 @@ public class OptionsPane extends JPanel { private final IconPane iconPane; private final Selector taskPane; - private final Selector modePane; - private final Selector aliasPane; + private final Selector modePane; + private final Selector aliasPane; - private final Selector sourcePane; - private final Selector targetPane; + private final Selector sourcePane; + private final Selector targetPane; private final JTextField boundField; @@ -45,13 +45,13 @@ public OptionsPane(){ iconPane = new IconPane(IconCode.DARTAGNAN, getIconHeight(), JLabel.CENTER); - taskPane = new Selector<>(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); - modePane = new Selector<>(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); - aliasPane = new Selector<>(EnumSet.allOf(Alias.class).toArray(new Alias[0]), ControlCode.ALIAS); + taskPane = new Selector(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); + modePane = new Selector(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); + aliasPane = new Selector(EnumSet.allOf(Alias.class).toArray(new Alias[0]), ControlCode.ALIAS); Arch[] architectures = EnumSet.allOf(Arch.class).toArray(new Arch[0]); - sourcePane = new Selector<>(architectures, ControlCode.SOURCE); - targetPane = new Selector<>(architectures, ControlCode.TARGET); + sourcePane = new Selector(architectures, ControlCode.SOURCE); + targetPane = new Selector(architectures, ControlCode.TARGET); sourcePane.setEnabled(false); archManager = new ArchManager(sourcePane, targetPane); @@ -81,7 +81,7 @@ private void bindListeners(){ taskPane.addActionListener(iconPane); } - public Selector getTaskPane(){ + public Selector getTaskPane(){ return taskPane; } diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java index dcad77923c..6f8b091baa 100644 --- a/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java @@ -1,5 +1,6 @@ package com.dat3m.ui.options.utils; +import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.ui.editor.Editor; import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.options.Selector; @@ -11,13 +12,13 @@ public class ArchManager implements ActionListener { - private Selector sourceSelector; - private Selector targetSelector; + private Selector sourceSelector; + private Selector targetSelector; private boolean isEnabled = true; private boolean isSourceEnabled = false; - public ArchManager(Selector sourceSelector, Selector targetSelector){ + public ArchManager(Selector sourceSelector, Selector targetSelector){ this.targetSelector = targetSelector; this.sourceSelector = sourceSelector; } From 256b2227dcb31f2c70aca20abd174adf56497ec1 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 13 Mar 2019 17:10:24 +0100 Subject: [PATCH 058/145] Icon height based on the display size --- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 63faba6452..daeade3bf4 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -14,7 +14,10 @@ import java.awt.*; import java.util.EnumSet; +import static com.dat3m.ui.utils.Utils.getMainScreenHeight; import static java.awt.FlowLayout.LEFT; +import static java.lang.Math.max; +import static java.lang.Math.round; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.border.TitledBorder.CENTER; @@ -117,9 +120,8 @@ public Options getOptions(){ ); } - // TODO: Implementation private int getIconHeight(){ - return 300; + return max(300, (int) round((getMainScreenHeight() / 3))); } // TODO: Refactoring From 72ffae5a51246416953e18887a836609536a40fe Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 13 Mar 2019 17:24:23 +0100 Subject: [PATCH 059/145] Icon of a max size based on display size --- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index daeade3bf4..584dec3daf 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -17,6 +17,7 @@ import static com.dat3m.ui.utils.Utils.getMainScreenHeight; import static java.awt.FlowLayout.LEFT; import static java.lang.Math.max; +import static java.lang.Math.min; import static java.lang.Math.round; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.border.TitledBorder.CENTER; @@ -121,7 +122,7 @@ public Options getOptions(){ } private int getIconHeight(){ - return max(300, (int) round((getMainScreenHeight() / 3))); + return min(500, (int) round((getMainScreenHeight() / 2))); } // TODO: Refactoring From de6af302fe3619f5d0f1b2294952a18ee366ba7e Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 14 Mar 2019 17:13:19 +0100 Subject: [PATCH 060/145] Handling not valid bounds --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- .../com/dat3m/ui/listener/BoundListener.java | 65 +++++++++++++++++++ .../java/com/dat3m/ui/options/BoundPane.java | 28 ++++++++ .../com/dat3m/ui/options/OptionsPane.java | 12 ++-- 4 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/listener/BoundListener.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/BoundPane.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 56fa99540d..ab2bd1395d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -125,7 +125,7 @@ private void runTest(){ } } - private void showError(String msg){ + public static void showError(String msg){ JOptionPane.showMessageDialog( null, msg, diff --git a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java new file mode 100644 index 0000000000..be44433485 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java @@ -0,0 +1,65 @@ +package com.dat3m.ui.listener; + +import static com.dat3m.ui.Dat3M.showError; + +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import com.dat3m.ui.options.BoundPane; + +public class BoundListener implements KeyListener, FocusListener { + + private BoundPane boundPane; + + public BoundListener(BoundPane pane) { + this.boundPane = pane; + } + + @Override + public void keyPressed(KeyEvent e) { + runTest(); + } + + @Override + public void keyReleased(KeyEvent e) { + runTest(); } + + @Override + public void keyTyped(KeyEvent e) { + runTest(); + } + + private void runTest() { + String cText = boundPane.getText(); + try { + int cBound = Integer.parseInt(cText); + if(cBound <= 0) { + showError("The bound should be greater than 1"); + boundPane.setText(boundPane.getStableBound()); + } + boundPane.setStableBound(cText); + } catch (Exception e) { + // Empty string is allowed here. It will be handled by focusLost + if(cText.equals("")) { + return; + } + boundPane.setText(boundPane.getStableBound()); + showError("The bound should be greater than 1"); + } + } + + @Override + public void focusGained(FocusEvent arg0) { + // Nothing t be done here + } + + @Override + public void focusLost(FocusEvent arg0) { + if(boundPane.getText().equals("")) { + boundPane.setText(boundPane.getStableBound()); + showError("The bound should be greatwer than 1"); + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/BoundPane.java b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java new file mode 100644 index 0000000000..500f7d2211 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java @@ -0,0 +1,28 @@ +package com.dat3m.ui.options; + +import javax.swing.JTextField; + +import com.dat3m.ui.listener.BoundListener; + +public class BoundPane extends JTextField { + + private String stableBound; + + public BoundPane() { + this.stableBound = "1"; + this.setColumns(3); + this.setText("1"); + + BoundListener listener = new BoundListener(this); + this.addKeyListener(listener); + this.addFocusListener(listener); + } + + public void setStableBound(String bound) { + this.stableBound = bound; + } + + public String getStableBound() { + return stableBound; + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 584dec3daf..ebf444677a 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -16,7 +16,6 @@ import static com.dat3m.ui.utils.Utils.getMainScreenHeight; import static java.awt.FlowLayout.LEFT; -import static java.lang.Math.max; import static java.lang.Math.min; import static java.lang.Math.round; import static javax.swing.BorderFactory.createTitledBorder; @@ -33,7 +32,7 @@ public class OptionsPane extends JPanel { private final Selector sourcePane; private final Selector targetPane; - private final JTextField boundField; + private final BoundPane boundField; private final JButton testButton; private final JButton clearButton; @@ -59,9 +58,7 @@ public OptionsPane(){ sourcePane.setEnabled(false); archManager = new ArchManager(sourcePane, targetPane); - // TODO: New class with a field which forbids illegal values - boundField = new JTextField("1", 3); - boundField.setActionCommand(ControlCode.BOUND.actionCommand()); + boundField = new BoundPane(); testButton = new JButton("Test"); testButton.setActionCommand(ControlCode.TEST.actionCommand()); @@ -93,6 +90,10 @@ public ArchManager getArchManager(){ return archManager; } + public BoundPane getBoundPane(){ + return boundField; + } + public JButton getTestButton(){ return testButton; } @@ -116,7 +117,6 @@ public Options getOptions(){ (Arch)sourcePane.getSelectedItem(), (Mode)modePane.getSelectedItem(), (Alias)aliasPane.getSelectedItem(), - // TODO: Handle possible exceptions in the new boundField class Integer.parseInt(boundField.getText()) ); } From 416cf426ffdb428e1d745e33d5c8698785955225 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 14 Mar 2019 17:28:19 +0100 Subject: [PATCH 061/145] Editors size based on Screen size --- ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index f73b158e62..b958471700 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -6,6 +6,11 @@ import javax.swing.*; import javax.swing.border.TitledBorder; + +import static com.dat3m.ui.utils.Utils.getMainScreenHeight; +import static com.dat3m.ui.utils.Utils.getMainScreenWidth; + +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -25,7 +30,11 @@ public EditorsPane(){ menu = new JMenu("Import"); menu.add(editors.get(EditorCode.PROGRAM).getMenuItem()); menu.add(editors.get(EditorCode.TARGET_MM).getMenuItem()); - + + Dimension editorsDimension = new Dimension(2 * getMainScreenWidth() / 5, getMainScreenHeight()); + editors.get(EditorCode.PROGRAM).setPreferredSize(editorsDimension); + editors.get(EditorCode.TARGET_MM).setPreferredSize(editorsDimension); + mmPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); mmPane.setBottomComponent(editors.get(EditorCode.TARGET_MM)); mmPane.setOneTouchExpandable(true); From 88c41bf512543137e5cec69df295e6e37c74c6f1 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 14 Mar 2019 18:16:58 +0100 Subject: [PATCH 062/145] Actions for clearing the console - Part 1 --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 11 +++------ .../com/dat3m/ui/options/ConsolePane.java | 23 +++++++++++++++++++ .../com/dat3m/ui/options/OptionsPane.java | 8 +++---- 3 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/options/ConsolePane.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index ab2bd1395d..f6360c9c26 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -50,8 +50,9 @@ private Dat3M() { mainPane.setDividerSize(2); add(mainPane); - // EditorsPane needs to know is task is changed in order to show / hide source model editor + // EditorsPane and ConsolePane need to know if task is changed in order to show / hide source model editor optionsPane.getTaskPane().addActionListener(editorsPane); + optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); // ArchPane needs to know which program format has been loaded by editor in order to show / hide target editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane.getArchManager()); @@ -59,6 +60,7 @@ private Dat3M() { // Start listening to button events optionsPane.getTestButton().addActionListener(this); optionsPane.getClearButton().addActionListener(this); + optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); optionsPane.getGraphButton().addActionListener(this); pack(); @@ -80,10 +82,6 @@ public void actionPerformed(ActionEvent event) { optionsPane.getConsolePane().setText(testResult.getVerdict()); optionsPane.getGraphButton().setEnabled(testResult.getGraph() != null); } - - } else if(ControlCode.CLEAR.actionCommand().equals(command)){ - System.out.println("I should clear. What should I clear?"); - // TODO: Implementation } else if(ControlCode.GRAPH.actionCommand().equals(command)){ // TODO: Implementation EventQueue.invokeLater(graph::open); @@ -103,20 +101,17 @@ private void runTest(){ Wmm targetModel = new ParserCat().parse(targetModelRaw, options.getTarget()); if(options.getTask() == Task.REACHABILITY){ testResult = new ReachabilityResult(program, targetModel, options); - } else { try { Program sourceProgram = new ProgramParser().parse(programText, format); String sourceModelRaw = editorsPane.getEditor(EditorCode.SOURCE_MM).getText(); Wmm sourceModel = new ParserCat().parse(sourceModelRaw, options.getSource()); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); - } catch (Exception e){ showError("The source memory model was not imported or cannot be parsed"); } } } catch (Exception e){ - e.printStackTrace(); showError("The target memory model was not imported or cannot be parsed"); } } catch (Exception e){ diff --git a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java new file mode 100644 index 0000000000..b01fde08a5 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java @@ -0,0 +1,23 @@ +package com.dat3m.ui.options; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JTextPane; + +import com.dat3m.ui.options.utils.ControlCode; + +public class ConsolePane extends JTextPane implements ActionListener { + + @Override + public void actionPerformed(ActionEvent event) { + String command = event.getActionCommand(); + if(ControlCode.CLEAR.actionCommand().equals(command)){ + setText(""); + } + if(ControlCode.TASK.actionCommand().equals(command)){ + setText(""); + } + // TODO clear the console when every option is changed + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index ebf444677a..68eac916d3 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -38,7 +38,7 @@ public class OptionsPane extends JPanel { private final JButton clearButton; private final JButton graphButton; - private final JTextPane consolePane; + private final ConsolePane consolePane; private final ArchManager archManager; @@ -63,14 +63,14 @@ public OptionsPane(){ testButton = new JButton("Test"); testButton.setActionCommand(ControlCode.TEST.actionCommand()); - clearButton = new JButton("Clear"); + clearButton = new JButton("Clear Console"); clearButton.setActionCommand(ControlCode.CLEAR.actionCommand()); graphButton = new JButton("Execution Witness"); graphButton.setActionCommand(ControlCode.GRAPH.actionCommand()); graphButton.setEnabled(false); - consolePane = new JTextPane(); + consolePane = new ConsolePane(); consolePane.setEditable(false); bindListeners(); @@ -106,7 +106,7 @@ public JButton getGraphButton(){ return graphButton; } - public JTextPane getConsolePane(){ + public ConsolePane getConsolePane(){ return consolePane; } From a04160e0b6e8ffe6c68d9a2dd1443a6302ee1e72 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 15 Mar 2019 14:26:40 +0200 Subject: [PATCH 063/145] Branch 2.0.3 version --- dartagnan/pom.xml | 2 +- pom.xml | 2 +- porthos/pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dartagnan/pom.xml b/dartagnan/pom.xml index 18ed5ccbf4..e594558183 100644 --- a/dartagnan/pom.xml +++ b/dartagnan/pom.xml @@ -6,7 +6,7 @@ com.dat3m dat3m - 2.0.2 + 2.0.3 com.dat3m.dartagnan diff --git a/pom.xml b/pom.xml index ded29ad217..cf2226dd20 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.dat3m dat3m - 2.0.2 + 2.0.3 pom dat3m diff --git a/porthos/pom.xml b/porthos/pom.xml index c3dcd71e01..c843706d45 100644 --- a/porthos/pom.xml +++ b/porthos/pom.xml @@ -6,7 +6,7 @@ dat3m com.dat3m - 2.0.2 + 2.0.3 com.dat3m.porthos @@ -19,7 +19,7 @@ com.dat3m.dartagnan dartagnan - 2.0.2 + 2.0.3 From 26cbe67f92fb3ca787e23b12f01c5f8fe8e62761 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 16:49:41 +0100 Subject: [PATCH 064/145] Added listener explanation --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index f6360c9c26..e307ebf148 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -50,8 +50,9 @@ private Dat3M() { mainPane.setDividerSize(2); add(mainPane); - // EditorsPane and ConsolePane need to know if task is changed in order to show / hide source model editor + // EditorsPane needs to know if task is changed in order to show / hide source model editor optionsPane.getTaskPane().addActionListener(editorsPane); + // ConsolePane need to know if task is changed to clean the console optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); // ArchPane needs to know which program format has been loaded by editor in order to show / hide target @@ -60,9 +61,11 @@ private Dat3M() { // Start listening to button events optionsPane.getTestButton().addActionListener(this); optionsPane.getClearButton().addActionListener(this); - optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); optionsPane.getGraphButton().addActionListener(this); + // ConsolePane need to listen to clear button to clean the console + optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); + pack(); } From 4f5215cbf1d691767aadde5585470c88a48a62d9 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 16:54:37 +0100 Subject: [PATCH 065/145] Scaled Dat3M icon size in error msg --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e307ebf148..8a9aedb453 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -129,6 +129,6 @@ public static void showError(String msg){ msg, "Error", JOptionPane.ERROR_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M)); + IconHelper.getIcon(IconCode.DAT3M, 60)); } } From 8be896bc25d5867c3c75b95a7a3a738a0528c597 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 17:08:25 +0100 Subject: [PATCH 066/145] Factorize display of error messages --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 8 +++++-- .../main/java/com/dat3m/ui/editor/Editor.java | 22 +++++-------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 8a9aedb453..64677b47dc 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -123,12 +123,16 @@ private void runTest(){ } } - public static void showError(String msg){ + public static void showError(String msg, String title){ JOptionPane.showMessageDialog( null, msg, - "Error", + title, JOptionPane.ERROR_MESSAGE, IconHelper.getIcon(IconCode.DAT3M, 60)); } + + public static void showError(String msg){ + showError(msg, "Error"); + } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index a1e5ba3786..a8454dc617 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -1,7 +1,5 @@ package com.dat3m.ui.editor; -import com.dat3m.ui.icon.IconCode; -import com.dat3m.ui.icon.IconHelper; import com.google.common.collect.ImmutableSet; import javax.swing.*; @@ -15,6 +13,7 @@ import java.io.InputStreamReader; import java.util.*; +import static com.dat3m.ui.Dat3M.showError; import static java.lang.System.getProperty; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.JFileChooser.APPROVE_OPTION; @@ -70,8 +69,7 @@ public String getText(){ public void actionPerformed(ActionEvent event) { if(code.editorMenuActionCommand().equals(event.getActionCommand())){ chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); - int result = chooser.showOpenDialog(null); - if(result == APPROVE_OPTION){ + if(chooser.showOpenDialog(null) == APPROVE_OPTION){ String path = chooser.getSelectedFile().getPath(); String format = path.substring(path.lastIndexOf('.') + 1).trim(); if(allowedFormats.contains(format)){ @@ -80,21 +78,11 @@ public void actionPerformed(ActionEvent event) { try { editorPane.read(new InputStreamReader(new FileInputStream(path)), null); } catch (IOException e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - null, - "Error reading input file", - "Error", - JOptionPane.ERROR_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M)); + showError("Error reading input file"); } } else { - JOptionPane.showMessageDialog( - null, - "Please select a *." + String.join(", *.", allowedFormats) + " file", - "Invalid file format", - JOptionPane.INFORMATION_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M)); + showError("Please select a *." + String.join(", *.", allowedFormats) + " file", + "Invalid file format"); } } } From a8e263a00d461e504d3c5753718679e82c41f9ec Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 17:15:20 +0100 Subject: [PATCH 067/145] Handling bounds --- ui/src/main/java/com/dat3m/ui/listener/BoundListener.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java index be44433485..05e86b9456 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java @@ -36,17 +36,17 @@ private void runTest() { try { int cBound = Integer.parseInt(cText); if(cBound <= 0) { - showError("The bound should be greater than 1"); + showError("The bound should be greater than 1", "Option error"); boundPane.setText(boundPane.getStableBound()); } boundPane.setStableBound(cText); } catch (Exception e) { - // Empty string is allowed here. It will be handled by focusLost + // Empty string is allowed here to allow deleting. It will be handled by focusLost if(cText.equals("")) { return; } boundPane.setText(boundPane.getStableBound()); - showError("The bound should be greater than 1"); + showError("The bound should be greater than 1", "Option error"); } } @@ -59,7 +59,7 @@ public void focusGained(FocusEvent arg0) { public void focusLost(FocusEvent arg0) { if(boundPane.getText().equals("")) { boundPane.setText(boundPane.getStableBound()); - showError("The bound should be greatwer than 1"); + showError("The bound should be greater than 1", "Option error"); } } } From 3c390a3a356fdeb807142b4ccc18d7da3297184e Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 18:23:30 +0100 Subject: [PATCH 068/145] Clean console when bound is updated --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 3 ++- .../java/com/dat3m/ui/options/BoundPane.java | 18 ++++++++++++++++++ .../java/com/dat3m/ui/options/ConsolePane.java | 3 +++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 64677b47dc..4e0d0398b6 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -63,8 +63,9 @@ private Dat3M() { optionsPane.getClearButton().addActionListener(this); optionsPane.getGraphButton().addActionListener(this); - // ConsolePane need to listen to clear button to clean the console + // ConsolePane needs to listen to clean the console optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); + optionsPane.getBoundPane().addActionListener(optionsPane.getConsolePane()); pack(); } diff --git a/ui/src/main/java/com/dat3m/ui/options/BoundPane.java b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java index 500f7d2211..a6ea110c3b 100644 --- a/ui/src/main/java/com/dat3m/ui/options/BoundPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java @@ -1,5 +1,12 @@ package com.dat3m.ui.options; +import static com.dat3m.ui.options.utils.ControlCode.BOUND; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; + import javax.swing.JTextField; import com.dat3m.ui.listener.BoundListener; @@ -8,6 +15,8 @@ public class BoundPane extends JTextField { private String stableBound; + private Set actionListeners = new HashSet<>(); + public BoundPane() { this.stableBound = "1"; this.setColumns(3); @@ -18,8 +27,17 @@ public BoundPane() { this.addFocusListener(listener); } + public void addActionListener(ActionListener actionListener){ + actionListeners.add(actionListener); + } + public void setStableBound(String bound) { this.stableBound = bound; + // Listeners are notified when a new stable bound is set + ActionEvent boundChanged = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, BOUND.actionCommand()); + for(ActionListener actionListener : actionListeners){ + actionListener.actionPerformed(boundChanged); + } } public String getStableBound() { diff --git a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java index b01fde08a5..722ba6b5ba 100644 --- a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java +++ b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java @@ -18,6 +18,9 @@ public void actionPerformed(ActionEvent event) { if(ControlCode.TASK.actionCommand().equals(command)){ setText(""); } + if(ControlCode.BOUND.actionCommand().equals(command)){ + setText(""); + } // TODO clear the console when every option is changed } } From 3a8bb4e2e84cde98a38c3426bd0b52d6df29abc8 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 18:27:22 +0100 Subject: [PATCH 069/145] Reordered code --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 4e0d0398b6..cebd4328b0 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -52,8 +52,6 @@ private Dat3M() { // EditorsPane needs to know if task is changed in order to show / hide source model editor optionsPane.getTaskPane().addActionListener(editorsPane); - // ConsolePane need to know if task is changed to clean the console - optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); // ArchPane needs to know which program format has been loaded by editor in order to show / hide target editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane.getArchManager()); @@ -63,7 +61,8 @@ private Dat3M() { optionsPane.getClearButton().addActionListener(this); optionsPane.getGraphButton().addActionListener(this); - // ConsolePane needs to listen to clean the console + // ConsolePane needs to listen to be cleaned + optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); optionsPane.getBoundPane().addActionListener(optionsPane.getConsolePane()); From d7c57f609611a4f75bf9d1874a05b2dc060776e9 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 18:42:57 +0100 Subject: [PATCH 070/145] Console cleaned after any change that can impact the result --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 +++++ .../com/dat3m/ui/options/ConsolePane.java | 22 ++++++++++++++++--- .../com/dat3m/ui/options/OptionsPane.java | 8 +++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index cebd4328b0..18c6e69d00 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -63,8 +63,13 @@ private Dat3M() { // ConsolePane needs to listen to be cleaned optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); + optionsPane.getTargetPane().addActionListener(optionsPane.getConsolePane()); + optionsPane.getSourcePane().addActionListener(optionsPane.getConsolePane()); optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); optionsPane.getBoundPane().addActionListener(optionsPane.getConsolePane()); + editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane.getConsolePane()); + editorsPane.getEditor(EditorCode.SOURCE_MM).addActionListener(optionsPane.getConsolePane()); + editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane.getConsolePane()); pack(); } diff --git a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java index 722ba6b5ba..7cfee780f7 100644 --- a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java +++ b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java @@ -5,6 +5,7 @@ import javax.swing.JTextPane; +import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.options.utils.ControlCode; public class ConsolePane extends JTextPane implements ActionListener { @@ -12,15 +13,30 @@ public class ConsolePane extends JTextPane implements ActionListener { @Override public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); - if(ControlCode.CLEAR.actionCommand().equals(command)){ + // TODO(HP): cleaner way? + if(ControlCode.TASK.actionCommand().equals(command)){ setText(""); } - if(ControlCode.TASK.actionCommand().equals(command)){ + if(ControlCode.TARGET.actionCommand().equals(command)){ + setText(""); + } + if(ControlCode.SOURCE.actionCommand().equals(command)){ setText(""); } if(ControlCode.BOUND.actionCommand().equals(command)){ setText(""); } - // TODO clear the console when every option is changed + if(ControlCode.CLEAR.actionCommand().equals(command)){ + setText(""); + } + if(EditorCode.PROGRAM.editorActionCommand().equals(command)){ + setText(""); + } + if(EditorCode.SOURCE_MM.editorActionCommand().equals(command)){ + setText(""); + } + if(EditorCode.TARGET_MM.editorActionCommand().equals(command)){ + setText(""); + } } } diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 68eac916d3..ef3cfdd2af 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -86,6 +86,14 @@ public Selector getTaskPane(){ return taskPane; } + public Selector getTargetPane(){ + return targetPane; + } + + public Selector getSourcePane(){ + return sourcePane; + } + public ArchManager getArchManager(){ return archManager; } From 1ad24841ca45545ffeb05b70ab464572c629e334 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 17 Mar 2019 22:43:43 +0100 Subject: [PATCH 071/145] Code refactoring --- .../java/com/dat3m/ui/options/IconPane.java | 6 +- .../com/dat3m/ui/options/OptionsPane.java | 75 +++++++------------ 2 files changed, 28 insertions(+), 53 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/IconPane.java b/ui/src/main/java/com/dat3m/ui/options/IconPane.java index 98f89bbfd7..a7ea0c7eca 100644 --- a/ui/src/main/java/com/dat3m/ui/options/IconPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/IconPane.java @@ -2,6 +2,7 @@ import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; +import com.dat3m.ui.options.utils.ControlCode; import com.dat3m.ui.utils.Task; import javax.swing.*; @@ -19,9 +20,8 @@ public class IconPane extends JLabel implements ActionListener { @Override public void actionPerformed(ActionEvent event) { - Object source = event.getSource(); - if(source instanceof JComboBox){ - JComboBox selector = (JComboBox)source; + if(ControlCode.TASK.actionCommand().equals(event.getActionCommand())){ + JComboBox selector = (JComboBox)event.getSource(); if(selector.getModel().getSelectedItem().equals(Task.PORTABILITY)){ setIcon(IconHelper.getIcon(IconCode.PORTHOS, height)); } else { diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index ef3cfdd2af..d1f4423590 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -12,7 +12,9 @@ import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.*; +import java.util.Arrays; import java.util.EnumSet; +import java.util.Iterator; import static com.dat3m.ui.utils.Utils.getMainScreenHeight; import static java.awt.FlowLayout.LEFT; @@ -29,6 +31,7 @@ public class OptionsPane extends JPanel { private final Selector modePane; private final Selector aliasPane; + private final ArchManager archManager; private final Selector sourcePane; private final Selector targetPane; @@ -40,9 +43,6 @@ public class OptionsPane extends JPanel { private final ConsolePane consolePane; - private final ArchManager archManager; - - public OptionsPane(){ super(new GridLayout(1,0)); @@ -54,8 +54,8 @@ public OptionsPane(){ Arch[] architectures = EnumSet.allOf(Arch.class).toArray(new Arch[0]); sourcePane = new Selector(architectures, ControlCode.SOURCE); - targetPane = new Selector(architectures, ControlCode.TARGET); sourcePane.setEnabled(false); + targetPane = new Selector(architectures, ControlCode.TARGET); archManager = new ArchManager(sourcePane, targetPane); boundField = new BoundPane(); @@ -133,71 +133,46 @@ private int getIconHeight(){ return min(500, (int) round((getMainScreenHeight() / 2))); } - // TODO: Refactoring private void mkGrid(){ int width = 300; - // Dimensions - testButton.setMaximumSize(new Dimension(width, 50)); - clearButton.setMaximumSize(new Dimension(width, 50)); - graphButton.setMaximumSize(new Dimension(width, 50)); + // Buttons dimension + Dimension buttonDimention = new Dimension(width, 50); + testButton.setMaximumSize(buttonDimention); + clearButton.setMaximumSize(buttonDimention); + graphButton.setMaximumSize(buttonDimention); JScrollPane scrollConsole = new JScrollPane(consolePane); scrollConsole.setMaximumSize(new Dimension(width, 120)); scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - JLabel uLabel = new JLabel("Unrolling Bound: "); JPanel boundPane = new JPanel(new FlowLayout(LEFT)); - boundPane.add(uLabel); + boundPane.add(new JLabel("Unrolling Bound: ")); boundPane.add(boundField); JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); archPane.setLeftComponent(sourcePane); archPane.setRightComponent(targetPane); - archPane.setPreferredSize(new Dimension(300, 0)); + archPane.setPreferredSize(new Dimension(width, 0)); archPane.setDividerSize(0); - //Put the options in a split pane. - JSplitPane sp0 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, iconPane, taskPane); - sp0.setDividerSize(2); - JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp0, archPane); - sp1.setDividerSize(2); - JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp1, modePane); - sp2.setDividerSize(2); - JSplitPane sp3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp2, aliasPane); - sp3.setDividerSize(2); - JSplitPane sp4 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp3, boundPane); - sp4.setDividerSize(2); - JSplitPane sp5 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp4, testButton); - sp5.setDividerSize(2); - JSplitPane sp6 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp5, clearButton); - sp6.setDividerSize(2); - JSplitPane sp7 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp6, graphButton); - sp7.setDividerSize(2); - JSplitPane sp8 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp7, scrollConsole); - sp8.setDividerSize(2); - add(sp8); - // Inner borders Border emptyBorder = BorderFactory.createEmptyBorder(); - iconPane.setBorder(emptyBorder); - taskPane.setBorder(emptyBorder); - modePane.setBorder(emptyBorder); - aliasPane.setBorder(emptyBorder); - archPane.setBorder(emptyBorder); - sourcePane.setBorder(emptyBorder); - taskPane.setBorder(emptyBorder); - - sp0.setBorder(emptyBorder); - sp1.setBorder(emptyBorder); - sp2.setBorder(emptyBorder); - sp3.setBorder(emptyBorder); - sp4.setBorder(emptyBorder); - sp5.setBorder(emptyBorder); - sp6.setBorder(emptyBorder); - sp7.setBorder(emptyBorder); - sp8.setBorder(emptyBorder); + JComponent[] panes = { taskPane, archPane, modePane, aliasPane, boundPane, testButton, clearButton, graphButton, scrollConsole }; + Iterator it = Arrays.asList(panes).iterator(); + JComponent current = iconPane; + current.setBorder(emptyBorder); + while(it.hasNext()) { + JComponent next = it.next(); + current = new JSplitPane(JSplitPane.VERTICAL_SPLIT, current, next); + ((JSplitPane)current).setDividerSize(2); + current.setBorder(emptyBorder); + if(!(next instanceof JButton)) { + next.setBorder(emptyBorder); + } + } + add(current); // Outer border TitledBorder titledBorder = createTitledBorder("Options"); From ef706acd4d699fbd29ced4034a2ad488f2b29337 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 11:05:02 +0100 Subject: [PATCH 072/145] Clear console refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 19 +++++---- .../com/dat3m/ui/options/ConsolePane.java | 42 ------------------- .../com/dat3m/ui/options/OptionsPane.java | 16 +++++-- 3 files changed, 22 insertions(+), 55 deletions(-) delete mode 100644 ui/src/main/java/com/dat3m/ui/options/ConsolePane.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 18c6e69d00..a3fd399fd3 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -61,15 +61,16 @@ private Dat3M() { optionsPane.getClearButton().addActionListener(this); optionsPane.getGraphButton().addActionListener(this); - // ConsolePane needs to listen to be cleaned - optionsPane.getTaskPane().addActionListener(optionsPane.getConsolePane()); - optionsPane.getTargetPane().addActionListener(optionsPane.getConsolePane()); - optionsPane.getSourcePane().addActionListener(optionsPane.getConsolePane()); - optionsPane.getClearButton().addActionListener(optionsPane.getConsolePane()); - optionsPane.getBoundPane().addActionListener(optionsPane.getConsolePane()); - editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane.getConsolePane()); - editorsPane.getEditor(EditorCode.SOURCE_MM).addActionListener(optionsPane.getConsolePane()); - editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane.getConsolePane()); + // optionsPane needs to listen to options to clean the console + // Alias and Mode do not change the result and thus we don't listen to them + optionsPane.getTaskPane().addActionListener(optionsPane); + optionsPane.getTargetPane().addActionListener(optionsPane); + optionsPane.getSourcePane().addActionListener(optionsPane); + optionsPane.getBoundPane().addActionListener(optionsPane); + optionsPane.getClearButton().addActionListener(optionsPane); + editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane); + editorsPane.getEditor(EditorCode.SOURCE_MM).addActionListener(optionsPane); + editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); pack(); } diff --git a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java b/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java deleted file mode 100644 index 7cfee780f7..0000000000 --- a/ui/src/main/java/com/dat3m/ui/options/ConsolePane.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dat3m.ui.options; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JTextPane; - -import com.dat3m.ui.editor.EditorCode; -import com.dat3m.ui.options.utils.ControlCode; - -public class ConsolePane extends JTextPane implements ActionListener { - - @Override - public void actionPerformed(ActionEvent event) { - String command = event.getActionCommand(); - // TODO(HP): cleaner way? - if(ControlCode.TASK.actionCommand().equals(command)){ - setText(""); - } - if(ControlCode.TARGET.actionCommand().equals(command)){ - setText(""); - } - if(ControlCode.SOURCE.actionCommand().equals(command)){ - setText(""); - } - if(ControlCode.BOUND.actionCommand().equals(command)){ - setText(""); - } - if(ControlCode.CLEAR.actionCommand().equals(command)){ - setText(""); - } - if(EditorCode.PROGRAM.editorActionCommand().equals(command)){ - setText(""); - } - if(EditorCode.SOURCE_MM.editorActionCommand().equals(command)){ - setText(""); - } - if(EditorCode.TARGET_MM.editorActionCommand().equals(command)){ - setText(""); - } - } -} diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index d1f4423590..eebd634f4d 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -12,6 +12,8 @@ import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.Arrays; import java.util.EnumSet; import java.util.Iterator; @@ -23,7 +25,7 @@ import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.border.TitledBorder.CENTER; -public class OptionsPane extends JPanel { +public class OptionsPane extends JPanel implements ActionListener { private final IconPane iconPane; @@ -41,7 +43,7 @@ public class OptionsPane extends JPanel { private final JButton clearButton; private final JButton graphButton; - private final ConsolePane consolePane; + private final JTextPane consolePane; public OptionsPane(){ super(new GridLayout(1,0)); @@ -70,7 +72,7 @@ public OptionsPane(){ graphButton.setActionCommand(ControlCode.GRAPH.actionCommand()); graphButton.setEnabled(false); - consolePane = new ConsolePane(); + consolePane = new JTextPane(); consolePane.setEditable(false); bindListeners(); @@ -114,7 +116,7 @@ public JButton getGraphButton(){ return graphButton; } - public ConsolePane getConsolePane(){ + public JTextPane getConsolePane(){ return consolePane; } @@ -179,4 +181,10 @@ private void mkGrid(){ titledBorder.setTitleJustification(CENTER); setBorder(titledBorder); } + + @Override + public void actionPerformed(ActionEvent e) { + // Any change in the (relevant) options clears the console + getConsolePane().setText(""); + } } From d3445abf4914265ea1374cbd1cb4e8b95c0b1a4d Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 11:09:40 +0100 Subject: [PATCH 073/145] Clear console: code refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 8 +------- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 7 +++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a3fd399fd3..14294f3190 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -61,13 +61,7 @@ private Dat3M() { optionsPane.getClearButton().addActionListener(this); optionsPane.getGraphButton().addActionListener(this); - // optionsPane needs to listen to options to clean the console - // Alias and Mode do not change the result and thus we don't listen to them - optionsPane.getTaskPane().addActionListener(optionsPane); - optionsPane.getTargetPane().addActionListener(optionsPane); - optionsPane.getSourcePane().addActionListener(optionsPane); - optionsPane.getBoundPane().addActionListener(optionsPane); - optionsPane.getClearButton().addActionListener(optionsPane); + // optionsPane needs to listen to editor to clean the console editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane); editorsPane.getEditor(EditorCode.SOURCE_MM).addActionListener(optionsPane); editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index eebd634f4d..7587242220 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -82,6 +82,13 @@ public OptionsPane(){ private void bindListeners(){ taskPane.addActionListener(archManager); taskPane.addActionListener(iconPane); + // optionsPane needs to listen to options to clean the console + // Alias and Mode do not change the result and thus we don't listen to them + taskPane.addActionListener(this); + targetPane.addActionListener(this); + sourcePane.addActionListener(this); + boundField.addActionListener(this); + clearButton.addActionListener(this); } public Selector getTaskPane(){ From a68fefa67aa5c532e30e178aa4177307aef3ce02 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 11:28:08 +0100 Subject: [PATCH 074/145] More refactoring --- .../java/com/dat3m/ui/button/ClearButton.java | 18 ++++++++ .../java/com/dat3m/ui/button/GraphButton.java | 19 ++++++++ .../java/com/dat3m/ui/button/TestButton.java | 18 ++++++++ .../com/dat3m/ui/listener/BoundListener.java | 6 +-- .../java/com/dat3m/ui/options/BoundField.java | 46 +++++++++++++++++++ .../java/com/dat3m/ui/options/BoundPane.java | 44 +++--------------- .../com/dat3m/ui/options/OptionsPane.java | 38 ++++++--------- 7 files changed, 125 insertions(+), 64 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/button/ClearButton.java create mode 100644 ui/src/main/java/com/dat3m/ui/button/GraphButton.java create mode 100644 ui/src/main/java/com/dat3m/ui/button/TestButton.java create mode 100644 ui/src/main/java/com/dat3m/ui/options/BoundField.java diff --git a/ui/src/main/java/com/dat3m/ui/button/ClearButton.java b/ui/src/main/java/com/dat3m/ui/button/ClearButton.java new file mode 100644 index 0000000000..2176e77a9e --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/button/ClearButton.java @@ -0,0 +1,18 @@ +package com.dat3m.ui.button; + +import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; + +import java.awt.Dimension; + +import javax.swing.JButton; + +import com.dat3m.ui.options.utils.ControlCode; + +public class ClearButton extends JButton { + + public ClearButton() { + super("Clear Console"); + setActionCommand(ControlCode.CLEAR.actionCommand()); + setMaximumSize(new Dimension(OPTWIDTH, 50)); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/button/GraphButton.java b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java new file mode 100644 index 0000000000..a9fe5e233b --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java @@ -0,0 +1,19 @@ +package com.dat3m.ui.button; + +import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; + +import java.awt.Dimension; + +import javax.swing.JButton; + +import com.dat3m.ui.options.utils.ControlCode; + +public class GraphButton extends JButton { + + public GraphButton() { + super("Execution Witness"); + setActionCommand(ControlCode.GRAPH.actionCommand()); + setEnabled(false); + setMaximumSize(new Dimension(OPTWIDTH, 50)); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/button/TestButton.java b/ui/src/main/java/com/dat3m/ui/button/TestButton.java new file mode 100644 index 0000000000..1626ea1895 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/button/TestButton.java @@ -0,0 +1,18 @@ +package com.dat3m.ui.button; + +import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; + +import java.awt.Dimension; + +import javax.swing.JButton; + +import com.dat3m.ui.options.utils.ControlCode; + +public class TestButton extends JButton { + + public TestButton() { + super("Test"); + setActionCommand(ControlCode.TEST.actionCommand()); + setMaximumSize(new Dimension(OPTWIDTH, 50)); + } +} diff --git a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java index 05e86b9456..a4871fbc96 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java @@ -7,13 +7,13 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import com.dat3m.ui.options.BoundPane; +import com.dat3m.ui.options.BoundField; public class BoundListener implements KeyListener, FocusListener { - private BoundPane boundPane; + private BoundField boundPane; - public BoundListener(BoundPane pane) { + public BoundListener(BoundField pane) { this.boundPane = pane; } diff --git a/ui/src/main/java/com/dat3m/ui/options/BoundField.java b/ui/src/main/java/com/dat3m/ui/options/BoundField.java new file mode 100644 index 0000000000..e27e315153 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/options/BoundField.java @@ -0,0 +1,46 @@ +package com.dat3m.ui.options; + +import static com.dat3m.ui.options.utils.ControlCode.BOUND; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; + +import javax.swing.JTextField; + +import com.dat3m.ui.listener.BoundListener; + +public class BoundField extends JTextField { + + private String stableBound; + + private Set actionListeners = new HashSet<>(); + + public BoundField() { + this.stableBound = "1"; + this.setColumns(3); + this.setText("1"); + + BoundListener listener = new BoundListener(this); + this.addKeyListener(listener); + this.addFocusListener(listener); + } + + public void addActionListener(ActionListener actionListener){ + actionListeners.add(actionListener); + } + + public void setStableBound(String bound) { + this.stableBound = bound; + // Listeners are notified when a new stable bound is set + ActionEvent boundChanged = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, BOUND.actionCommand()); + for(ActionListener actionListener : actionListeners){ + actionListener.actionPerformed(boundChanged); + } + } + + public String getStableBound() { + return stableBound; + } +} diff --git a/ui/src/main/java/com/dat3m/ui/options/BoundPane.java b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java index a6ea110c3b..58ebedadb5 100644 --- a/ui/src/main/java/com/dat3m/ui/options/BoundPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/BoundPane.java @@ -1,46 +1,16 @@ package com.dat3m.ui.options; -import static com.dat3m.ui.options.utils.ControlCode.BOUND; +import static java.awt.FlowLayout.LEFT; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.HashSet; -import java.util.Set; +import java.awt.FlowLayout; -import javax.swing.JTextField; +import javax.swing.JLabel; +import javax.swing.JPanel; -import com.dat3m.ui.listener.BoundListener; - -public class BoundPane extends JTextField { - - private String stableBound; - - private Set actionListeners = new HashSet<>(); +public class BoundPane extends JPanel { public BoundPane() { - this.stableBound = "1"; - this.setColumns(3); - this.setText("1"); - - BoundListener listener = new BoundListener(this); - this.addKeyListener(listener); - this.addFocusListener(listener); - } - - public void addActionListener(ActionListener actionListener){ - actionListeners.add(actionListener); - } - - public void setStableBound(String bound) { - this.stableBound = bound; - // Listeners are notified when a new stable bound is set - ActionEvent boundChanged = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, BOUND.actionCommand()); - for(ActionListener actionListener : actionListeners){ - actionListener.actionPerformed(boundChanged); - } - } - - public String getStableBound() { - return stableBound; + super(new FlowLayout(LEFT)); + add(new JLabel("Unrolling Bound: ")); } } diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 7587242220..a36dfedca0 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -3,6 +3,9 @@ import com.dat3m.dartagnan.program.utils.Alias; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.ui.button.ClearButton; +import com.dat3m.ui.button.GraphButton; +import com.dat3m.ui.button.TestButton; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.options.utils.ArchManager; import com.dat3m.ui.options.utils.ControlCode; @@ -19,7 +22,6 @@ import java.util.Iterator; import static com.dat3m.ui.utils.Utils.getMainScreenHeight; -import static java.awt.FlowLayout.LEFT; import static java.lang.Math.min; import static java.lang.Math.round; import static javax.swing.BorderFactory.createTitledBorder; @@ -27,6 +29,8 @@ public class OptionsPane extends JPanel implements ActionListener { + public final static int OPTWIDTH = 300; + private final IconPane iconPane; private final Selector taskPane; @@ -37,7 +41,7 @@ public class OptionsPane extends JPanel implements ActionListener { private final Selector sourcePane; private final Selector targetPane; - private final BoundPane boundField; + private final BoundField boundField; private final JButton testButton; private final JButton clearButton; @@ -60,17 +64,11 @@ public OptionsPane(){ targetPane = new Selector(architectures, ControlCode.TARGET); archManager = new ArchManager(sourcePane, targetPane); - boundField = new BoundPane(); + boundField = new BoundField(); - testButton = new JButton("Test"); - testButton.setActionCommand(ControlCode.TEST.actionCommand()); - - clearButton = new JButton("Clear Console"); - clearButton.setActionCommand(ControlCode.CLEAR.actionCommand()); - - graphButton = new JButton("Execution Witness"); - graphButton.setActionCommand(ControlCode.GRAPH.actionCommand()); - graphButton.setEnabled(false); + testButton = new TestButton(); + clearButton = new ClearButton(); + graphButton = new GraphButton(); consolePane = new JTextPane(); consolePane.setEditable(false); @@ -107,7 +105,7 @@ public ArchManager getArchManager(){ return archManager; } - public BoundPane getBoundPane(){ + public BoundField getBoundPane(){ return boundField; } @@ -143,26 +141,18 @@ private int getIconHeight(){ } private void mkGrid(){ - int width = 300; - - // Buttons dimension - Dimension buttonDimention = new Dimension(width, 50); - testButton.setMaximumSize(buttonDimention); - clearButton.setMaximumSize(buttonDimention); - graphButton.setMaximumSize(buttonDimention); JScrollPane scrollConsole = new JScrollPane(consolePane); - scrollConsole.setMaximumSize(new Dimension(width, 120)); + scrollConsole.setMaximumSize(new Dimension(OPTWIDTH, 120)); scrollConsole.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - JPanel boundPane = new JPanel(new FlowLayout(LEFT)); - boundPane.add(new JLabel("Unrolling Bound: ")); + JPanel boundPane = new BoundPane(); boundPane.add(boundField); JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); archPane.setLeftComponent(sourcePane); archPane.setRightComponent(targetPane); - archPane.setPreferredSize(new Dimension(width, 0)); + archPane.setPreferredSize(new Dimension(OPTWIDTH, 0)); archPane.setDividerSize(0); // Inner borders From 8be797a5894055d7f59d308417f3cd76100a498c Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Mon, 18 Mar 2019 16:06:26 +0200 Subject: [PATCH 075/145] Updated version number in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cbb15f3c5e..72f989ae62 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,11 @@ Usage ====== For checking reachability: ``` -java -jar dartagnan/target/dartagnan-2.0.2-jar-with-dependencies.jar -cat -i [-t ] [options] +java -jar dartagnan/target/dartagnan-2.0.3-jar-with-dependencies.jar -cat -i [-t ] [options] ``` For checking state inclusion: ``` -java -jar porthos/target/porthos-2.0.2-jar-with-dependencies.jar -s -scat -t -tcat -i [options] +java -jar porthos/target/porthos-2.0.3-jar-with-dependencies.jar -s -scat -t -tcat -i [options] ``` Dartagnan supports programs written in the .litmus or .pts formats (see below). For Porthos, programs shall be written in the .pts format since they need to be compiled to two different architectures. From 60fe4f18969bb49f97ee59abf1927f91fdf434c6 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 16:45:34 +0100 Subject: [PATCH 076/145] Implemented graph creation --- .../java/com/dat3m/dartagnan/utils/Graph.java | 3 +- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 ++- .../java/com/dat3m/ui/graph/GraphOption.java | 39 +++++++------------ .../java/com/dat3m/ui/result/Dat3mResult.java | 2 + .../dat3m/ui/result/PortabilityResult.java | 15 +++++++ .../dat3m/ui/result/ReachabilityResult.java | 11 ++++++ 6 files changed, 49 insertions(+), 26 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java index 767e704286..cb08ce2055 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java @@ -87,11 +87,12 @@ public Graph build(Program pSource, Program pTarget){ return this; } - public void draw(String filename) throws IOException { + public File draw(String filename) throws IOException { File newTextFile = new File(filename); FileWriter fw = new FileWriter(newTextFile); fw.write(buffer.toString()); fw.close(); + return newTextFile; } private StringBuilder buildProgramGraph(Program program){ diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 14294f3190..2974ae510c 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -86,12 +86,12 @@ public void actionPerformed(ActionEvent event) { optionsPane.getGraphButton().setEnabled(testResult.getGraph() != null); } } else if(ControlCode.GRAPH.actionCommand().equals(command)){ - // TODO: Implementation EventQueue.invokeLater(graph::open); } } private void runTest(){ + // TODO(HP): fail for porthos when *.litmus Options options = optionsPane.getOptions(); if(options.validate()){ testResult = null; @@ -120,6 +120,9 @@ private void runTest(){ } catch (Exception e){ showError("The program was not imported or cannot be parsed"); } + if(testResult != null && testResult.isSat()) { + graph.generate(testResult); + } } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index c5d408d2f6..801ba252d9 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -17,12 +17,8 @@ import javax.swing.JLabel; import javax.swing.JScrollPane; -import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.utils.Graph; -import com.dat3m.porthos.PorthosResult; -import com.microsoft.z3.Context; -import com.microsoft.z3.Solver; - +import com.dat3m.ui.result.Dat3mResult; import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; @@ -31,25 +27,20 @@ public class GraphOption { private final String TMPDOTPATH = "./.tmp/output.dot"; private final String TMPPNGPATH = "./.tmp/output.png"; - public void generate(Solver solver, Context ctx, Object o) { - Graph graph = new Graph(solver.getModel(), ctx); - try { - if(o instanceof Program) { - Program p = (Program)o; - graph.build(p).draw(TMPDOTPATH); - } else if (o instanceof PorthosResult) { - PorthosResult result = (PorthosResult)o; - graph.build(result.getSourceProgram(), result.getTargetProgram()).draw(TMPDOTPATH); - } - File dotFile = new File(TMPDOTPATH); - // The previous png file needs to be deleted - Path fileToDeletePath = Paths.get(TMPPNGPATH); - Files.delete(fileToDeletePath); - InputStream targetStream = new FileInputStream(dotFile); - MutableGraph g = Parser.read(targetStream); - fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); - dotFile.delete(); - } catch (IOException e) { + public void generate(Dat3mResult res) { + try { + if(res.isSat()) { + Graph graph = res.getGraph(); + File dotFile = graph.draw(TMPDOTPATH); + // The previous png file needs to be deleted + Path fileToDeletePath = Paths.get(TMPPNGPATH); + Files.delete(fileToDeletePath); + InputStream targetStream = new FileInputStream(dotFile); + MutableGraph g = Parser.read(targetStream); + fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); + dotFile.delete(); + } + } catch (IOException e) { // This should never happen since the file is always created } } diff --git a/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java index 6054287c59..5bade22b6d 100644 --- a/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java @@ -7,4 +7,6 @@ public interface Dat3mResult { String getVerdict(); Graph getGraph(); + + boolean isSat(); } diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index 8e7e505b14..bf2e8ad83b 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -16,6 +16,7 @@ public class PortabilityResult implements Dat3mResult { private final Wmm sourceWmm; private final Wmm targetWmm; private final Options options; + private boolean isSat = false; private Graph graph; private String verdict; @@ -29,6 +30,14 @@ public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourc run(); } + public Program getSourceProgram() { + return sourceProgram; + } + + public Program getTargetProgram() { + return targetProgram; + } + public Graph getGraph(){ return graph; } @@ -51,7 +60,13 @@ private void run(){ if(!result.getIsPortable()){ graph = new Graph(s1.getModel(), ctx); graph.build(sourceProgram, targetProgram); + isSat = true; } ctx.close(); } + + @Override + public boolean isSat() { + return isSat; + } } diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index c80d034712..e290e8ffcb 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -14,6 +14,7 @@ public class ReachabilityResult implements Dat3mResult { private final Program program; private final Wmm wmm; private final Options options; + private boolean isSat = false; private Graph graph; private String verdict; @@ -25,6 +26,10 @@ public ReachabilityResult(Program program, Wmm wmm, Options options){ run(); } + public Program getProgram() { + return program; + } + public Graph getGraph(){ return graph; } @@ -45,6 +50,7 @@ private void run(){ if(Dartagnan.canDrawGraph(program.getAss(), result)){ graph = new Graph(solver.getModel(), ctx); graph.build(program); + isSat = true; } ctx.close(); } @@ -58,4 +64,9 @@ private void buildVerdict(boolean result){ sb.append(result ? "OK" : "No").append("\n"); verdict = sb.toString(); } + + @Override + public boolean isSat() { + return isSat; + } } From 00f3550d7dbce712dcc6db0c530584b435e6f453 Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 16:46:34 +0100 Subject: [PATCH 077/145] Disable graph button when option change --- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index a36dfedca0..4eee01275a 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -181,7 +181,8 @@ private void mkGrid(){ @Override public void actionPerformed(ActionEvent e) { - // Any change in the (relevant) options clears the console + // Any change in the (relevant) options clears the console and disable graph button getConsolePane().setText(""); + graphButton.setEnabled(false); } } From 2791f465f25d6cddd6ff3620f76d7a3960e1e4fc Mon Sep 17 00:00:00 2001 From: ponce Date: Mon, 18 Mar 2019 16:54:59 +0100 Subject: [PATCH 078/145] Porthos fails when loadedFormat is not pts --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 2974ae510c..f781e3b934 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -91,7 +91,6 @@ public void actionPerformed(ActionEvent event) { } private void runTest(){ - // TODO(HP): fail for porthos when *.litmus Options options = optionsPane.getOptions(); if(options.validate()){ testResult = null; @@ -106,19 +105,23 @@ private void runTest(){ testResult = new ReachabilityResult(program, targetModel, options); } else { try { + if(!editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat().equals("pts")) { + showError("PORTHOS only supports *.pts files", "Loading error"); + return; + } Program sourceProgram = new ProgramParser().parse(programText, format); String sourceModelRaw = editorsPane.getEditor(EditorCode.SOURCE_MM).getText(); Wmm sourceModel = new ParserCat().parse(sourceModelRaw, options.getSource()); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); } catch (Exception e){ - showError("The source memory model was not imported or cannot be parsed"); + showError("The source memory model was not imported or cannot be parsed", "Loading or parsing error"); } } } catch (Exception e){ - showError("The target memory model was not imported or cannot be parsed"); + showError("The target memory model was not imported or cannot be parsed", "Loading or parsing error"); } } catch (Exception e){ - showError("The program was not imported or cannot be parsed"); + showError("The program was not imported or cannot be parsed", "Loading or parsing error"); } if(testResult != null && testResult.isSat()) { graph.generate(testResult); From bd7953368b84b74be93856708318e1687fab0e1d Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Mon, 18 Mar 2019 18:39:35 +0200 Subject: [PATCH 079/145] Removed unnecessary clause from rf encoding --- .../main/java/com/dat3m/dartagnan/wmm/relation/basic/RelRf.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/relation/basic/RelRf.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/relation/basic/RelRf.java index 4529995d54..50a4e6a02f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/relation/basic/RelRf.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/relation/basic/RelRf.java @@ -84,7 +84,6 @@ private BoolExpr encodeEO(int readId, List set){ int num = set.size(); BoolExpr enc = ctx.mkEq(mkL(readId, 0), ctx.mkFalse()); - enc = ctx.mkAnd(enc, ctx.mkNot(ctx.mkAnd(set.get(0), mkL(readId, 0)))); BoolExpr atLeastOne = set.get(0); for(int i = 1; i < num; i++){ From 0d687f0c199d9704721aff3b3d4266ee5b32f9c9 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 19 Mar 2019 15:07:09 +0100 Subject: [PATCH 080/145] Moved showError to Utils --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 14 +------------- .../main/java/com/dat3m/ui/editor/Editor.java | 4 ++-- .../com/dat3m/ui/listener/BoundListener.java | 2 +- ui/src/main/java/com/dat3m/ui/utils/Utils.java | 17 +++++++++++++++++ 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index f781e3b934..70af3b959e 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -22,6 +22,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.dat3m.ui.utils.Utils.showError; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.UIManager.getDefaults; @@ -128,17 +129,4 @@ private void runTest(){ } } } - - public static void showError(String msg, String title){ - JOptionPane.showMessageDialog( - null, - msg, - title, - JOptionPane.ERROR_MESSAGE, - IconHelper.getIcon(IconCode.DAT3M, 60)); - } - - public static void showError(String msg){ - showError(msg, "Error"); - } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index a8454dc617..efaa3e959d 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -13,7 +13,7 @@ import java.io.InputStreamReader; import java.util.*; -import static com.dat3m.ui.Dat3M.showError; +import static com.dat3m.ui.utils.Utils.showError; import static java.lang.System.getProperty; import static javax.swing.BorderFactory.createTitledBorder; import static javax.swing.JFileChooser.APPROVE_OPTION; @@ -78,7 +78,7 @@ public void actionPerformed(ActionEvent event) { try { editorPane.read(new InputStreamReader(new FileInputStream(path)), null); } catch (IOException e) { - showError("Error reading input file"); + showError("Error reading input file"); } } else { showError("Please select a *." + String.join(", *.", allowedFormats) + " file", diff --git a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java index a4871fbc96..669da82955 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java @@ -1,6 +1,6 @@ package com.dat3m.ui.listener; -import static com.dat3m.ui.Dat3M.showError; +import static com.dat3m.ui.utils.Utils.showError; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 210da8c038..c0870a08e6 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -10,11 +10,15 @@ import java.io.Writer; import javax.swing.JEditorPane; +import javax.swing.JOptionPane; + import com.dat3m.dartagnan.parsers.cat.ParserCat; import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.ui.icon.IconCode; +import com.dat3m.ui.icon.IconHelper; public class Utils { @@ -67,4 +71,17 @@ public static int getMainScreenHeight() { } return 0; } + + public static void showError(String msg, String title){ + JOptionPane.showMessageDialog( + null, + msg, + title, + JOptionPane.ERROR_MESSAGE, + IconHelper.getIcon(IconCode.DAT3M, 60)); + } + + public static void showError(String msg){ + showError(msg, "Error"); + } } From 47796ecc5aaee345cd2f0203af69ef8e2bbcd9c2 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 19 Mar 2019 15:08:25 +0100 Subject: [PATCH 081/145] Moved getResource to Utils --- ui/src/main/java/com/dat3m/ui/icon/IconCode.java | 6 ++---- ui/src/main/java/com/dat3m/ui/utils/Utils.java | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java index efb96cd007..9ed1cea11d 100644 --- a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java +++ b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java @@ -2,6 +2,8 @@ import com.dat3m.ui.Dat3M; +import static com.dat3m.ui.utils.Utils.getResource; + import java.net.URL; public enum IconCode { @@ -32,8 +34,4 @@ public URL getPath(){ } throw new RuntimeException("Illegal IconCode option"); } - - private URL getResource(String filename){ - return Dat3M.class.getResource(filename); - } } diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index c0870a08e6..8fa6c8e3d6 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; +import java.net.URL; import javax.swing.JEditorPane; import javax.swing.JOptionPane; @@ -17,6 +18,7 @@ import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.ui.Dat3M; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; @@ -84,4 +86,8 @@ public static void showError(String msg, String title){ public static void showError(String msg){ showError(msg, "Error"); } + + public static URL getResource(String filename){ + return Dat3M.class.getResource(filename); + } } From 20da1e9197da30566e188e4cbdac31536ecca4f8 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 19 Mar 2019 15:08:47 +0100 Subject: [PATCH 082/145] Removed unused import --- ui/src/main/java/com/dat3m/ui/icon/IconCode.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java index 9ed1cea11d..2fc17d4943 100644 --- a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java +++ b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java @@ -1,7 +1,5 @@ package com.dat3m.ui.icon; -import com.dat3m.ui.Dat3M; - import static com.dat3m.ui.utils.Utils.getResource; import java.net.URL; From 06b4f11ef04f0a92c9393b69208d0dfe97b797c3 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 19 Mar 2019 16:41:21 +0100 Subject: [PATCH 083/145] Generation of execution graph --- .../java/com/dat3m/ui/graph/GraphOption.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 801ba252d9..e50d19fdd5 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -24,21 +24,20 @@ public class GraphOption { - private final String TMPDOTPATH = "./.tmp/output.dot"; - private final String TMPPNGPATH = "./.tmp/output.png"; + //TODO(HP): make it work when run from launcher + private File dotFile = new File(".tmp/output.dot"); + private File pngFile = new File(".tmp/output.png"); public void generate(Dat3mResult res) { try { if(res.isSat()) { Graph graph = res.getGraph(); - File dotFile = graph.draw(TMPDOTPATH); + File dot2File = graph.draw(dotFile.getAbsolutePath()); // The previous png file needs to be deleted - Path fileToDeletePath = Paths.get(TMPPNGPATH); - Files.delete(fileToDeletePath); - InputStream targetStream = new FileInputStream(dotFile); + pngFile.delete(); + InputStream targetStream = new FileInputStream(dot2File); MutableGraph g = Parser.read(targetStream); - fromGraph(g).render(PNG).toFile(new File(TMPPNGPATH)); - dotFile.delete(); + fromGraph(g).render(PNG).toFile(pngFile); } } catch (IOException e) { // This should never happen since the file is always created @@ -48,7 +47,7 @@ public void generate(Dat3mResult res) { public void open() { JLabel label = new JLabel(); // An image need to be created at every call since the image changes - label.setIcon(new ImageIcon(getDefaultToolkit().createImage(TMPPNGPATH))); + label.setIcon(new ImageIcon(getDefaultToolkit().createImage(pngFile.getAbsolutePath()))); JScrollPane scroll = new JScrollPane(label); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); From 57eb4ae168df3be1192d28e67d1de15c5d26c2d5 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 20 Mar 2019 14:58:22 +0100 Subject: [PATCH 084/145] Create tmp files and parent folder for execution witness when they do not exist --- .../main/java/com/dat3m/ui/graph/GraphOption.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index e50d19fdd5..0a4d42c7a2 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -8,9 +8,8 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; import javax.swing.ImageIcon; import javax.swing.JFrame; @@ -24,13 +23,20 @@ public class GraphOption { - //TODO(HP): make it work when run from launcher private File dotFile = new File(".tmp/output.dot"); private File pngFile = new File(".tmp/output.png"); public void generate(Dat3mResult res) { try { if(res.isSat()) { + List files = Arrays.asList(dotFile, pngFile); + // Create the file and parent directry if they do not exist + for(File f : files) { + if (f.getParentFile() != null) { + f.getParentFile().mkdirs(); + } + f.createNewFile(); + } Graph graph = res.getGraph(); File dot2File = graph.draw(dotFile.getAbsolutePath()); // The previous png file needs to be deleted From 6f85d861a406e70bbe9bc9fa727837d1f5824f9c Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 20 Mar 2019 16:07:21 +0100 Subject: [PATCH 085/145] Preparing to merge with 2.0.3 --- .../parsers/program/ParserInterface.java | 5 +- .../parsers/program/ParserLitmusAArch64.java | 13 ++++- .../parsers/program/ParserLitmusC.java | 11 +++- .../parsers/program/ParserLitmusPPC.java | 13 ++++- .../parsers/program/ParserLitmusX86.java | 11 +++- .../parsers/program/ParserPorthos.java | 14 ++++- .../parsers/program/ProgramParser.java | 54 +++++++------------ .../java/com/dat3m/dartagnan/utils/Graph.java | 2 +- .../com/dat3m/dartagnan/wmm/utils/Arch.java | 18 ++++++- ui/src/main/java/com/dat3m/ui/Dat3M.java | 4 +- 10 files changed, 95 insertions(+), 50 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java index 40a91ee631..58b867b3c6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java @@ -1,9 +1,10 @@ package com.dat3m.dartagnan.parsers.program; import com.dat3m.dartagnan.program.Program; -import org.antlr.v4.runtime.CharStream; + +import java.io.IOException; public interface ParserInterface { - Program parse(CharStream charStream); + Program parse(String inputFilePath) throws IOException; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java index 01a5364744..c3d4043376 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java @@ -10,12 +10,20 @@ import org.antlr.v4.runtime.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class ParserLitmusAArch64 implements ParserInterface { @Override - public Program parse(CharStream charStream) { + public Program parse(String inputFilePath) throws IOException { + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); + stream.close(); LitmusAArch64Parser parser = new LitmusAArch64Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -25,7 +33,8 @@ public Program parse(CharStream charStream) { VisitorLitmusAArch64 visitor = new VisitorLitmusAArch64(pb); Program program = (Program) parserEntryPoint.accept(visitor); + program.setName(inputFilePath); program.setArch(Arch.ARM8); return program; } -} +} \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 5a1e8a48ec..3ea040fff6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -9,12 +9,20 @@ import org.antlr.v4.runtime.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class ParserLitmusC implements ParserInterface { @Override - public Program parse(CharStream charStream) { + public Program parse(String inputFilePath) throws IOException { + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); LitmusCLexer lexer = new LitmusCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); + stream.close(); LitmusCParser parser = new LitmusCParser(tokenStream); parser.setErrorHandler(new BailErrorStrategy()); @@ -23,6 +31,7 @@ public Program parse(CharStream charStream) { VisitorLitmusC visitor = new VisitorLitmusC(pb); Program program = (Program) parserEntryPoint.accept(visitor); + program.setName(inputFilePath); program.setArch(Arch.NONE); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java index a52572417c..f0f246a33f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java @@ -10,12 +10,20 @@ import org.antlr.v4.runtime.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class ParserLitmusPPC implements ParserInterface { @Override - public Program parse(CharStream charStream) { + public Program parse(String inputFilePath) throws IOException { + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); + stream.close(); LitmusPPCParser parser = new LitmusPPCParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -25,7 +33,8 @@ public Program parse(CharStream charStream) { VisitorLitmusPPC visitor = new VisitorLitmusPPC(pb); Program program = (Program) parserEntryPoint.accept(visitor); + program.setName(inputFilePath); program.setArch(Arch.POWER); return program; } -} +} \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java index 32e27b9d8a..71e647b489 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java @@ -10,12 +10,20 @@ import org.antlr.v4.runtime.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class ParserLitmusX86 implements ParserInterface { @Override - public Program parse(CharStream charStream) { + public Program parse(String inputFilePath) throws IOException { + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); + stream.close(); LitmusX86Parser parser = new LitmusX86Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -25,6 +33,7 @@ public Program parse(CharStream charStream) { VisitorLitmusX86 visitor = new VisitorLitmusX86(pb); Program program = (Program) parserEntryPoint.accept(visitor); + program.setName(inputFilePath); program.setArch(Arch.TSO); return program; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java index 9998e6feae..f87ddbab72 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java @@ -8,12 +8,20 @@ import com.dat3m.dartagnan.program.Program; import org.antlr.v4.runtime.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + public class ParserPorthos implements ParserInterface{ @Override - public Program parse(CharStream charStream) { + public Program parse(String inputFilePath) throws IOException { + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); PorthosLexer lexer = new PorthosLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); + stream.close(); PorthosParser parser = new PorthosParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -22,6 +30,8 @@ public Program parse(CharStream charStream) { ParserRuleContext parserEntryPoint = parser.main(); VisitorPorthos visitor = new VisitorPorthos(pb); - return (Program) parserEntryPoint.accept(visitor); + Program program = (Program) parserEntryPoint.accept(visitor); + program.setName(inputFilePath); + return program; } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index fadb18a378..8235de110f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -2,10 +2,11 @@ import com.dat3m.dartagnan.parsers.program.utils.ParsingException; import com.dat3m.dartagnan.program.Program; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; public class ProgramParser { @@ -15,43 +16,26 @@ public class ProgramParser { private static final String TYPE_LITMUS_C = "C"; public Program parse(String inputFilePath) throws IOException { - ParserInterface parser = getConcreteParser(inputFilePath); - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program program = parser.parse(charStream); - stream.close(); - program.setName(inputFilePath); - return program; - } + ParserInterface parser = null; - public Program parse(String raw, String format) { - if(format.equals("pts")){ - return new ParserPorthos().parse(CharStreams.fromString(raw)); - } else if(format.equals("litmus")){ - return getConcreteLitmusParser(raw).parse(CharStreams.fromString(raw)); - } - throw new ParsingException("Unknown input file type"); - } - - private ParserInterface getConcreteParser(String inputFilePath) throws IOException { if(inputFilePath.endsWith("pts")){ - return new ParserPorthos(); + parser = new ParserPorthos(); + } else if(inputFilePath.endsWith("litmus")){ - return getConcreteLitmusParser(readFirstLine(inputFilePath).toUpperCase()); + String header = readFirstLine(inputFilePath).toUpperCase(); + if(header.indexOf(TYPE_LITMUS_AARCH64) == 0){ + parser = new ParserLitmusAArch64(); + } else if(header.indexOf(TYPE_LITMUS_C) == 0){ + parser = new ParserLitmusC(); + } else if(header.indexOf(TYPE_LITMUS_PPC) == 0){ + parser = new ParserLitmusPPC(); + } else if(header.indexOf(TYPE_LITMUS_X86) == 0){ + parser = new ParserLitmusX86(); + } } - throw new ParsingException("Unknown input file type"); - } - private ParserInterface getConcreteLitmusParser(String programText){ - if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ - return new ParserLitmusAArch64(); - } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ - return new ParserLitmusC(); - } else if(programText.indexOf(TYPE_LITMUS_PPC) == 0){ - return new ParserLitmusPPC(); - } else if(programText.indexOf(TYPE_LITMUS_X86) == 0){ - return new ParserLitmusX86(); + if(parser != null){ + return parser.parse(inputFilePath); } throw new ParsingException("Unknown input file type"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java index d1b964a9b5..80ec0cc1e0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java @@ -62,7 +62,7 @@ public void addRelations(Collection relations){ public Graph build(Program program){ buffer = new StringBuilder(); buffer.append("digraph G {\n") - .append(L1).append("subgraph cluster_Target { ").append("\n") + .append(L1).append("subgraph cluster_Target { ").append(getProgramDef(targetLabel)).append("\n") .append(buildProgramGraph(program)) .append(L1).append("}\n") .append("}\n"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java index 9f793a3bff..98f7799a3e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java @@ -1,7 +1,7 @@ package com.dat3m.dartagnan.wmm.utils; public enum Arch { - NONE, ARM, ARM8, POWER, TSO; + NONE, ALPHA, ARM, ARM8, POWER, PSO, RMO, TSO; public static Arch get(String arch){ if(arch != null){ @@ -9,12 +9,18 @@ public static Arch get(String arch){ switch(arch){ case "none": return NONE; + case "alpha": + throw new UnsupportedOperationException("Unsupported architecture alpha"); case "arm": return ARM; case "arm8": return ARM8; case "power": return POWER; + case "pso": + throw new UnsupportedOperationException("Unsupported architecture pso"); + case "rmo": + throw new UnsupportedOperationException("Unsupported architecture rmo"); case "tso": return TSO; } @@ -24,9 +30,11 @@ public static Arch get(String arch){ public boolean getIncludePoToCtrl(){ switch(this) { + case ALPHA: case ARM: case ARM8: case POWER: + case RMO: return true; default: return false; @@ -38,15 +46,21 @@ public String toString() { switch(this){ case NONE: return "none"; + case ALPHA: + return "alpha"; case ARM: return "arm"; case ARM8: return "arm8"; case POWER: return "power"; + case PSO: + return "pso"; + case RMO: + return "rmo"; case TSO: return "tso"; } return super.toString(); } -} +} \ No newline at end of file diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index fae25ea932..691c0dfd24 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -98,7 +98,7 @@ private void runTest(){ try { String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); String format = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); - Program program = new ProgramParser().parse(programText, format); + Program program = new ProgramParser().parse(programText); try { String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); Wmm targetModel = new ParserCat().parse(targetModelRaw); @@ -110,7 +110,7 @@ private void runTest(){ showError("PORTHOS only supports *.pts files", "Loading error"); return; } - Program sourceProgram = new ProgramParser().parse(programText, format); + Program sourceProgram = new ProgramParser().parse(programText); String sourceModelRaw = editorsPane.getEditor(EditorCode.SOURCE_MM).getText(); Wmm sourceModel = new ParserCat().parse(sourceModelRaw); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); From 2b5b7aa3d445aee7c26ff85e1ec4d81a29cb7193 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 20 Mar 2019 16:24:53 +0100 Subject: [PATCH 086/145] Conflicts solved. Now there are problems due to change in parsers --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 691c0dfd24..a0010d3536 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -92,12 +92,12 @@ public void actionPerformed(ActionEvent event) { } private void runTest(){ + // TODO(HP): talk with Natalia for the best way to normalize parsers Options options = optionsPane.getOptions(); if(options.validate()){ testResult = null; try { String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); - String format = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); Program program = new ProgramParser().parse(programText); try { String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); From affb3578082419c0305224c3f28bf9529d01edec Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 13:49:07 +0100 Subject: [PATCH 087/145] Parser working with ui --- .../dartagnan/parsers/cat/ParserCat.java | 11 +++++-- .../parsers/program/ParserInterface.java | 4 +++ .../parsers/program/ParserLitmusAArch64.java | 14 ++++++--- .../parsers/program/ParserLitmusC.java | 13 +++++--- .../parsers/program/ParserLitmusPPC.java | 14 ++++++--- .../parsers/program/ParserLitmusX86.java | 14 ++++++--- .../parsers/program/ParserPorthos.java | 14 ++++++--- .../parsers/program/ProgramParser.java | 31 +++++++++++++++++-- ui/src/main/java/com/dat3m/ui/Dat3M.java | 22 +++++++------ 9 files changed, 103 insertions(+), 34 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 7adec6482b..8d0d4643a2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -16,13 +16,18 @@ public Wmm parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - CatLexer lexer = new CatLexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Wmm wmm = parse(charStream); stream.close(); + return wmm; + } + + public Wmm parse(CharStream charStream) throws IOException { + CatLexer lexer = new CatLexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); CatParser parser = new CatParser(tokenStream); parser.setErrorHandler(new BailErrorStrategy()); ParserRuleContext parserEntryPoint = parser.mcm(); return (Wmm) parserEntryPoint.accept(new VisitorBase()); - } + } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java index 58b867b3c6..35d621d7ef 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java @@ -4,7 +4,11 @@ import java.io.IOException; +import org.antlr.v4.runtime.CharStream; + public interface ParserInterface { Program parse(String inputFilePath) throws IOException; + + Program parse(CharStream charStream) throws IOException; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java index c3d4043376..233b1df602 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java @@ -21,9 +21,16 @@ public Program parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Program p = parse(charStream); stream.close(); + p.setName(inputFilePath); + return p; + } + + @Override + public Program parse(CharStream charStream) throws IOException { + LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusAArch64Parser parser = new LitmusAArch64Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -33,8 +40,7 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusAArch64 visitor = new VisitorLitmusAArch64(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.ARM8); return program; - } + } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 3ea040fff6..101c29ceb7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -20,9 +20,15 @@ public Program parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - LitmusCLexer lexer = new LitmusCLexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Program p = parse(charStream); stream.close(); + p.setName(inputFilePath); + return p; + } + + public Program parse(CharStream charStream) throws IOException { + LitmusCLexer lexer = new LitmusCLexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusCParser parser = new LitmusCParser(tokenStream); parser.setErrorHandler(new BailErrorStrategy()); @@ -31,8 +37,7 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusC visitor = new VisitorLitmusC(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.NONE); return program; - } + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java index f0f246a33f..8ae9b7115c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java @@ -21,9 +21,16 @@ public Program parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Program p = parse(charStream); stream.close(); + p.setName(inputFilePath); + return p; + } + + @Override + public Program parse(CharStream charStream) throws IOException { + LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusPPCParser parser = new LitmusPPCParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -33,8 +40,7 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusPPC visitor = new VisitorLitmusPPC(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.POWER); return program; - } + } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java index 71e647b489..308d263621 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java @@ -21,10 +21,17 @@ public Program parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Program p = parse(charStream); stream.close(); + p.setName(inputFilePath); + return p; + } + @Override + public Program parse(CharStream charStream) throws IOException { + LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); + LitmusX86Parser parser = new LitmusX86Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); parser.addErrorListener(new ParserErrorListener()); @@ -33,8 +40,7 @@ public Program parse(String inputFilePath) throws IOException { VisitorLitmusX86 visitor = new VisitorLitmusX86(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); program.setArch(Arch.TSO); return program; - } + } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java index f87ddbab72..05928214de 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java @@ -19,9 +19,16 @@ public Program parse(String inputFilePath) throws IOException { File file = new File(inputFilePath); FileInputStream stream = new FileInputStream(file); CharStream charStream = CharStreams.fromStream(stream); - PorthosLexer lexer = new PorthosLexer(charStream); - CommonTokenStream tokenStream = new CommonTokenStream(lexer); + Program p = parse(charStream); stream.close(); + p.setName(inputFilePath); + return p; + } + + @Override + public Program parse(CharStream charStream) throws IOException { + PorthosLexer lexer = new PorthosLexer(charStream); + CommonTokenStream tokenStream = new CommonTokenStream(lexer); PorthosParser parser = new PorthosParser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); @@ -31,7 +38,6 @@ public Program parse(String inputFilePath) throws IOException { VisitorPorthos visitor = new VisitorPorthos(pb); Program program = (Program) parserEntryPoint.accept(visitor); - program.setName(inputFilePath); return program; - } + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 8235de110f..7f169dc170 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -8,9 +8,11 @@ import java.io.FileReader; import java.io.IOException; +import org.antlr.v4.runtime.CharStream; + public class ProgramParser { - private static final String TYPE_LITMUS_AARCH64 = "AARCH64"; + private static final String TYPE_LITMUS_AARCH64 = "AArch64"; private static final String TYPE_LITMUS_PPC = "PPC"; private static final String TYPE_LITMUS_X86 = "X86"; private static final String TYPE_LITMUS_C = "C"; @@ -40,7 +42,32 @@ public Program parse(String inputFilePath) throws IOException { throw new ParsingException("Unknown input file type"); } - private String readFirstLine(String inputFilePath) throws IOException{ + + public Program parse(CharStream charStream, String format) throws IOException { + ParserInterface parser = null; + String programText = charStream.toString(); + + if(format.equals("pts")){ + return new ParserPorthos().parse(charStream); + } else if(format.equals("litmus")){ + if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ + parser = new ParserLitmusAArch64(); + } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ + parser = new ParserLitmusC(); + } else if(programText.indexOf(TYPE_LITMUS_PPC) == 0){ + parser = new ParserLitmusPPC(); + } else if(programText.indexOf(TYPE_LITMUS_X86) == 0){ + parser = new ParserLitmusX86(); + } + } + + if(parser != null){ + return parser.parse(charStream); + } + throw new ParsingException("Unknown input file type"); + } + +private String readFirstLine(String inputFilePath) throws IOException{ File file = new File(inputFilePath); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a0010d3536..b5a12063e0 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -18,6 +18,10 @@ import com.dat3m.ui.utils.Task; import javax.swing.*; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; + import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -92,27 +96,27 @@ public void actionPerformed(ActionEvent event) { } private void runTest(){ - // TODO(HP): talk with Natalia for the best way to normalize parsers Options options = optionsPane.getOptions(); if(options.validate()){ testResult = null; try { - String programText = editorsPane.getEditor(EditorCode.PROGRAM).getText(); - Program program = new ProgramParser().parse(programText); + String loadedFormat = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); + CharStream programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); + Program program = new ProgramParser().parse(programStream, loadedFormat); try { - String targetModelRaw = editorsPane.getEditor(EditorCode.TARGET_MM).getText(); - Wmm targetModel = new ParserCat().parse(targetModelRaw); + CharStream tmmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.TARGET_MM).getText()); + Wmm targetModel = new ParserCat().parse(tmmStream); if(options.getTask() == Task.REACHABILITY){ testResult = new ReachabilityResult(program, targetModel, options); } else { try { - if(!editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat().equals("pts")) { + if(!loadedFormat.equals("pts")) { showError("PORTHOS only supports *.pts files", "Loading error"); return; } - Program sourceProgram = new ProgramParser().parse(programText); - String sourceModelRaw = editorsPane.getEditor(EditorCode.SOURCE_MM).getText(); - Wmm sourceModel = new ParserCat().parse(sourceModelRaw); + Program sourceProgram = new ProgramParser().parse(programStream, loadedFormat); + CharStream smmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.SOURCE_MM).getText()); + Wmm sourceModel = new ParserCat().parse(smmStream); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); } catch (Exception e){ showError("The source memory model was not imported or cannot be parsed", "Loading or parsing error"); From 5433718ab2c2fb9e97361233a30eb3eaf55f7a16 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 15:30:51 +0100 Subject: [PATCH 088/145] Solved parsing problem with porthos --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index b5a12063e0..b3b853fd04 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -114,6 +114,8 @@ private void runTest(){ showError("PORTHOS only supports *.pts files", "Loading error"); return; } + // We need to create the stream again to be read from the beginning + programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); Program sourceProgram = new ProgramParser().parse(programStream, loadedFormat); CharStream smmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.SOURCE_MM).getText()); Wmm sourceModel = new ParserCat().parse(smmStream); From 1f959cc23956ab3c4694674b47f6e222df9b8c98 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 15:35:37 +0100 Subject: [PATCH 089/145] Removed unused validate method --- ui/src/main/java/com/dat3m/ui/options/Options.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/Options.java b/ui/src/main/java/com/dat3m/ui/options/Options.java index 1405b5464e..2665414b11 100644 --- a/ui/src/main/java/com/dat3m/ui/options/Options.java +++ b/ui/src/main/java/com/dat3m/ui/options/Options.java @@ -46,14 +46,4 @@ public Alias getAlias() { public int getBound() { return bound; } - - // TODO: Implementation - public boolean validate(){ - boolean somethingIsWrong = false; - if(somethingIsWrong){ - // TODO: Show alert with what is wrong - return false; - } - return true; - } } From 1d6402f0d10829473620a6c9559509fdcf3529a1 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 15:36:16 +0100 Subject: [PATCH 090/145] Removed unused validate method --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 64 ++++++++++++------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index b3b853fd04..e6ed54832f 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -97,42 +97,40 @@ public void actionPerformed(ActionEvent event) { private void runTest(){ Options options = optionsPane.getOptions(); - if(options.validate()){ - testResult = null; - try { - String loadedFormat = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); - CharStream programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); - Program program = new ProgramParser().parse(programStream, loadedFormat); - try { - CharStream tmmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.TARGET_MM).getText()); - Wmm targetModel = new ParserCat().parse(tmmStream); - if(options.getTask() == Task.REACHABILITY){ - testResult = new ReachabilityResult(program, targetModel, options); - } else { - try { - if(!loadedFormat.equals("pts")) { - showError("PORTHOS only supports *.pts files", "Loading error"); - return; - } - // We need to create the stream again to be read from the beginning - programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); - Program sourceProgram = new ProgramParser().parse(programStream, loadedFormat); - CharStream smmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.SOURCE_MM).getText()); - Wmm sourceModel = new ParserCat().parse(smmStream); - testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); - } catch (Exception e){ - showError("The source memory model was not imported or cannot be parsed", "Loading or parsing error"); - } + testResult = null; + try { + String loadedFormat = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); + CharStream programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); + Program program = new ProgramParser().parse(programStream, loadedFormat); + try { + CharStream tmmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.TARGET_MM).getText()); + Wmm targetModel = new ParserCat().parse(tmmStream); + if(options.getTask() == Task.REACHABILITY){ + testResult = new ReachabilityResult(program, targetModel, options); + } else { + try { + if(!loadedFormat.equals("pts")) { + showError("PORTHOS only supports *.pts files", "Loading error"); + return; + } + // We need to create the stream again to be read from the beginning + programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); + Program sourceProgram = new ProgramParser().parse(programStream, loadedFormat); + CharStream smmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.SOURCE_MM).getText()); + Wmm sourceModel = new ParserCat().parse(smmStream); + testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); + } catch (Exception e){ + showError("The source memory model was not imported or cannot be parsed", "Loading or parsing error"); } - } catch (Exception e){ - showError("The target memory model was not imported or cannot be parsed", "Loading or parsing error"); } } catch (Exception e){ - showError("The program was not imported or cannot be parsed", "Loading or parsing error"); + showError("The target memory model was not imported or cannot be parsed", "Loading or parsing error"); } - if(testResult != null && testResult.isSat()) { - graph.generate(testResult); - } - } + } catch (Exception e){ + showError("The program was not imported or cannot be parsed", "Loading or parsing error"); + } + if(testResult != null && testResult.isSat()) { + graph.generate(testResult); + } } } From 9fd3cb81c105c88324eb81d71b0c206517aa28e2 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 15:59:25 +0100 Subject: [PATCH 091/145] Clear console when text in editors is modified --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 7 +++++ .../main/java/com/dat3m/ui/editor/Editor.java | 4 +++ .../com/dat3m/ui/listener/BoundListener.java | 3 +- .../com/dat3m/ui/listener/EditorListener.java | 30 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 ui/src/main/java/com/dat3m/ui/listener/EditorListener.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e6ed54832f..c4dc91c0a9 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -8,6 +8,7 @@ import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; +import com.dat3m.ui.listener.EditorListener; import com.dat3m.ui.graph.GraphOption; import com.dat3m.ui.options.Options; import com.dat3m.ui.options.OptionsPane; @@ -71,6 +72,12 @@ private Dat3M() { editorsPane.getEditor(EditorCode.SOURCE_MM).addActionListener(optionsPane); editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); + // The console shall be cleaned every time the program or MM is modified from the editor + EditorListener listener = new EditorListener(optionsPane.getConsolePane()); + editorsPane.getEditor(EditorCode.PROGRAM).getEditorPane().addKeyListener(listener); + editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().addKeyListener(listener); + editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().addKeyListener(listener); + pack(); } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index efaa3e959d..49e61a3335 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -92,6 +92,10 @@ JMenuItem getMenuItem(){ return menuItem; } + public JEditorPane getEditorPane(){ + return editorPane; + } + private void notifyListeners(){ ActionEvent dataLoadedEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, code.editorActionCommand()); for(ActionListener actionListener : actionListeners){ diff --git a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java index 669da82955..92abb89c23 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/BoundListener.java @@ -24,7 +24,8 @@ public void keyPressed(KeyEvent e) { @Override public void keyReleased(KeyEvent e) { - runTest(); } + runTest(); + } @Override public void keyTyped(KeyEvent e) { diff --git a/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java new file mode 100644 index 0000000000..92f6352757 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java @@ -0,0 +1,30 @@ +package com.dat3m.ui.listener; + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JTextPane; + +public class EditorListener implements KeyListener { + + private JTextPane consolePane; + + public EditorListener(JTextPane pane) { + this.consolePane = pane; + } + + @Override + public void keyPressed(KeyEvent e) { + // Nothing to be done + } + + @Override + public void keyReleased(KeyEvent e) { + // Nothing to be done + } + + @Override + public void keyTyped(KeyEvent e) { + consolePane.setText("");; + } +} From 6e1d7a756bef0686d44694ca0c79276b1b04c653 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 19:00:37 +0100 Subject: [PATCH 092/145] Execution witness button disabled when program or MM is edited --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- .../main/java/com/dat3m/ui/listener/EditorListener.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index c4dc91c0a9..dbafb60720 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -73,7 +73,7 @@ private Dat3M() { editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); // The console shall be cleaned every time the program or MM is modified from the editor - EditorListener listener = new EditorListener(optionsPane.getConsolePane()); + EditorListener listener = new EditorListener(optionsPane.getConsolePane(), optionsPane.getGraphButton()); editorsPane.getEditor(EditorCode.PROGRAM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().addKeyListener(listener); diff --git a/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java index 92f6352757..52b90c3df1 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java @@ -3,14 +3,17 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import javax.swing.JButton; import javax.swing.JTextPane; public class EditorListener implements KeyListener { private JTextPane consolePane; + private JButton clearButton; - public EditorListener(JTextPane pane) { + public EditorListener(JTextPane pane, JButton button) { this.consolePane = pane; + this.clearButton = button; } @Override @@ -25,6 +28,7 @@ public void keyReleased(KeyEvent e) { @Override public void keyTyped(KeyEvent e) { - consolePane.setText("");; + consolePane.setText(""); + clearButton.setEnabled(false); } } From 9cfdb0f964201310b69335763d539edfbca338bf Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 21 Mar 2019 19:22:28 +0100 Subject: [PATCH 093/145] Alias option --- ui/src/main/java/com/dat3m/ui/options/Options.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/Options.java b/ui/src/main/java/com/dat3m/ui/options/Options.java index 2665414b11..a465544d8a 100644 --- a/ui/src/main/java/com/dat3m/ui/options/Options.java +++ b/ui/src/main/java/com/dat3m/ui/options/Options.java @@ -1,8 +1,8 @@ package com.dat3m.ui.options; -import com.dat3m.dartagnan.wmm.utils.alias.Alias; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.dartagnan.wmm.utils.alias.Alias; import com.dat3m.ui.utils.Task; public class Options { From 7d0117cdda27f10d87e01b9bc5c1c164daa0b92d Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 09:46:02 +0100 Subject: [PATCH 094/145] Update README.md --- README.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 72f989ae62..4c09c9968a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ # Dat3M: Memory Model Aware Verification -This tool suite is currently composed of two tools. - -* **DARTAGNAN:** a tool to check state reachability under weak memory models. -

- +

+This tool suite is currently composed of two tools. + +* **DARTAGNAN:** a tool to check state reachability under weak memory models. * **PORTHOS:** a tool to check state inclusion under weak memory models.

@@ -26,12 +25,16 @@ apt-get install maven Installation ====== To build the tools, from the Dat3M/ directory run +* **Linux:** +``` +make +``` +* **MacOS:** ``` mvn install:install-file -Dfile=lib/z3-4.3.2.jar -DgroupId=com.microsoft -DartifactId="z3" -Dversion=4.3.2 -Dpackaging=jar mvn clean install -DskipTests -export LD_LIBRARY_PATH=./lib/ +export DYLD_LIBRARY_PATH=./lib/ ``` -(use DYLD_LIBRARY_PATH in MacOS) Unit Tests ====== @@ -42,6 +45,11 @@ mvn test Usage ====== +You can launch Dat3M using the launche in Linux, or in MacOS running +``` +java -jar ui/target/ +``` +Additionally, you can run DARTAGNAN and PORTHOS from the console. For checking reachability: ``` java -jar dartagnan/target/dartagnan-2.0.3-jar-with-dependencies.jar -cat -i [-t ] [options] From 15c375e957cb0966ea4a5af1eb30a6fa6b2e4aa1 Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 09:49:24 +0100 Subject: [PATCH 095/145] Update README.md --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4c09c9968a..6275248d22 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,6 @@ This tool suite is currently composed of two tools. * **DARTAGNAN:** a tool to check state reachability under weak memory models. * **PORTHOS:** a tool to check state inclusion under weak memory models. -

- -

- Requeriments ====== [Maven](https://maven.apache.org/) - Dependency Management @@ -45,11 +41,12 @@ mvn test Usage ====== -You can launch Dat3M using the launche in Linux, or in MacOS running +You can start Dat3M using the launcher in Linux, or in MacOS running ``` java -jar ui/target/ ``` Additionally, you can run DARTAGNAN and PORTHOS from the console. + For checking reachability: ``` java -jar dartagnan/target/dartagnan-2.0.3-jar-with-dependencies.jar -cat -i [-t ] [options] @@ -109,7 +106,7 @@ Examples are provided in the **benchmarks/** folder. | ⟨expr⟩ % ⟨expr⟩ ``` -Author and Contact +Authors and Contact ====== Dat3M is developed and maintained by [Hernán Ponce de León](mailto:ponce@fortiss.org), [Florian Furbach](mailto:f.furbach@tu-braunschweig.de) and [Natalia Gavrilenko](mailto:natalia.gavrilenko@aalto.fi). Please feel free to contact us in case of questions or to send feedback. From 494aa912e503c22b43a0b1ded3faa91350ca1dcb Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 10:01:04 +0100 Subject: [PATCH 096/145] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6275248d22..b9effbfdd3 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Usage ====== You can start Dat3M using the launcher in Linux, or in MacOS running ``` -java -jar ui/target/ +java -jar ui/target/ui-2.0.3-jar-with-dependencies.jar ``` Additionally, you can run DARTAGNAN and PORTHOS from the console. From b458c9281af6609f30d6ff1bd2d0717f87a91276 Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 10:02:29 +0100 Subject: [PATCH 097/145] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b9effbfdd3..5d75379aa9 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ For checking state inclusion: ``` java -jar porthos/target/porthos-2.0.3-jar-with-dependencies.jar -s -scat -t -tcat -i [options] ``` -Dartagnan supports programs written in the .litmus or .pts formats (see below). For Porthos, programs shall be written in the .pts format since they need to be compiled to two different architectures. +DARTAGNAN supports programs written in the .litmus or .pts formats (see below). For PORTHOS, programs shall be written in the .pts format since they need to be compiled to two different architectures. The -cat,-scat,-tcat options specify the paths to the CAT files. @@ -67,7 +67,7 @@ They must be one of the following: - arm - arm8 -**Note:** Option target is mandatory in dartagnan when using the.pts format. +**Note:** Option target is mandatory in DARTAGNAN when using the.pts format. Other optional arguments include: - -m, --mode {knastertarski, idl, kleene}: specifies the encoding for fixed points. Knaster-tarski (default mode) uses the encoding introduced in [1]. Mode idl uses the Integer Difference Logic iteration encoding introduced in [2]. Kleene mode uses the Kleene iteration encoding using one Boolean variable for each iteration step. From 31e08e556e04a65eded28ec78ac78211bdab95f0 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 22 Mar 2019 10:06:23 +0100 Subject: [PATCH 098/145] Updated version number --- ui/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/pom.xml b/ui/pom.xml index 69b6fe79f6..413c4064fb 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -6,7 +6,7 @@ dat3m com.dat3m - 2.0.2 + 2.0.3 com.dat3m.ui @@ -19,7 +19,7 @@ com.dat3m.porthos porthos - 2.0.2 + 2.0.3 guru.nidi From 7a62fae2afb3b5169f1950dd715471050793ca60 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 22 Mar 2019 10:27:10 +0100 Subject: [PATCH 099/145] updated Makefile --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8f0053d02a..691b0656b3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -JARPATH=$(PWD)/ui/target/ui-2.0.2-jar-with-dependencies.jar +JARPATH=$(PWD)/ui/target/ui-2.0.3-jar-with-dependencies.jar ICONPATH=$(PWD)/ui/src/main/resources/dat3m.png .PHONY: all install linux @@ -10,6 +10,11 @@ install: mvn clean install -DskipTests linux: + echo '[Desktop Entry]' > ./dat3m.desktop + echo 'Type=Application' >> ./dat3m.desktop + echo 'Name=Dat3M' >> ./dat3m.desktop + echo 'Comment=Dat3M' >> ./dat3m.desktop + echo 'Terminal=false' >> ./dat3m.desktop echo 'Exec=java -jar -Djava.library.path='$(PWD)'/lib '$(JARPATH) >> ./dat3m.desktop echo 'Icon='$(ICONPATH) >> ./dat3m.desktop chmod +x "./dat3m.desktop" From bfc70d8528519fb7c7f3076adf24f4fce0f80ef3 Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 14:10:39 +0100 Subject: [PATCH 100/145] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d75379aa9..dc42d4f5d7 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,8 @@ mvn test Usage ====== -You can start Dat3M using the launcher in Linux, or in MacOS running +* **Linux:** You can start Dat3M using the launcher +* **MacOS:** To run the tool, from the Dat3M/ directory run ``` java -jar ui/target/ui-2.0.3-jar-with-dependencies.jar ``` From 1509d9b72fd95ea5c51eaa7f84ffd853d6bcd797 Mon Sep 17 00:00:00 2001 From: Zeta Date: Fri, 22 Mar 2019 14:11:21 +0100 Subject: [PATCH 101/145] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc42d4f5d7..ef922fb3e4 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ mvn test Usage ====== -* **Linux:** You can start Dat3M using the launcher +* **Linux:** You can start the tool by double-clicking the launcher * **MacOS:** To run the tool, from the Dat3M/ directory run ``` java -jar ui/target/ui-2.0.3-jar-with-dependencies.jar From 66bd638b0245b54cb89e8c7333603180fc9b4cf8 Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 23 Mar 2019 10:05:47 +0100 Subject: [PATCH 102/145] Removed parsing problem for AArch64 --- .../com/dat3m/dartagnan/parsers/program/ProgramParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 7f169dc170..38755fb876 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -12,7 +12,7 @@ public class ProgramParser { - private static final String TYPE_LITMUS_AARCH64 = "AArch64"; + private static final String TYPE_LITMUS_AARCH64 = "AARCH64"; private static final String TYPE_LITMUS_PPC = "PPC"; private static final String TYPE_LITMUS_X86 = "X86"; private static final String TYPE_LITMUS_C = "C"; @@ -45,11 +45,11 @@ public Program parse(String inputFilePath) throws IOException { public Program parse(CharStream charStream, String format) throws IOException { ParserInterface parser = null; - String programText = charStream.toString(); if(format.equals("pts")){ return new ParserPorthos().parse(charStream); } else if(format.equals("litmus")){ + String programText = charStream.toString().toUpperCase(); if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ parser = new ParserLitmusAArch64(); } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ From ed3586c0c27d63f80bb2c670f83b1d9f7b70ffae Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 23 Mar 2019 15:36:44 +0100 Subject: [PATCH 103/145] Refactored repeated code in parser chooser --- .../java/com/dat3m/dartagnan/Dartagnan.java | 3 +- .../parsers/program/ProgramParser.java | 54 +++++++------------ .../main/java/com/dat3m/porthos/Porthos.java | 7 +-- .../main/java/com/dat3m/ui/utils/Utils.java | 2 +- 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index eb9b775ca1..61019d319b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -67,7 +67,8 @@ public static void main(String[] args) throws IOException { Mode mode = Mode.get(cmd.getOptionValue("mode")); Alias alias = Alias.get(cmd.getOptionValue("alias")); - Program p = new ProgramParser().parse(inputFilePath); + String format = inputFilePath.endsWith("pts") ? "pts" : "litmus"; + Program p = new ProgramParser().parse(inputFilePath, format); Arch target = p.getArch(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 38755fb876..b4c565e94b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -17,57 +17,39 @@ public class ProgramParser { private static final String TYPE_LITMUS_X86 = "X86"; private static final String TYPE_LITMUS_C = "C"; - public Program parse(String inputFilePath) throws IOException { + public Program parse(Object input, String format) throws IOException { ParserInterface parser = null; - - if(inputFilePath.endsWith("pts")){ - parser = new ParserPorthos(); - - } else if(inputFilePath.endsWith("litmus")){ - String header = readFirstLine(inputFilePath).toUpperCase(); - if(header.indexOf(TYPE_LITMUS_AARCH64) == 0){ - parser = new ParserLitmusAArch64(); - } else if(header.indexOf(TYPE_LITMUS_C) == 0){ - parser = new ParserLitmusC(); - } else if(header.indexOf(TYPE_LITMUS_PPC) == 0){ - parser = new ParserLitmusPPC(); - } else if(header.indexOf(TYPE_LITMUS_X86) == 0){ - parser = new ParserLitmusX86(); - } + String chooser = null; + if(input instanceof String) { + chooser = readFirstLine((String)input).toUpperCase(); + } else if(input instanceof CharStream) { + chooser = ((CharStream)input).toString().toUpperCase(); + } else { + throw new ParsingException("Unknown input file type"); } + + if(format.endsWith("pts")){ + parser = new ParserPorthos(); - if(parser != null){ - return parser.parse(inputFilePath); - } - throw new ParsingException("Unknown input file type"); - } - - - public Program parse(CharStream charStream, String format) throws IOException { - ParserInterface parser = null; - - if(format.equals("pts")){ - return new ParserPorthos().parse(charStream); - } else if(format.equals("litmus")){ - String programText = charStream.toString().toUpperCase(); - if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ + } else if(format.endsWith("litmus")){ + if(chooser.indexOf(TYPE_LITMUS_AARCH64) == 0){ parser = new ParserLitmusAArch64(); - } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ + } else if(chooser.indexOf(TYPE_LITMUS_C) == 0){ parser = new ParserLitmusC(); - } else if(programText.indexOf(TYPE_LITMUS_PPC) == 0){ + } else if(chooser.indexOf(TYPE_LITMUS_PPC) == 0){ parser = new ParserLitmusPPC(); - } else if(programText.indexOf(TYPE_LITMUS_X86) == 0){ + } else if(chooser.indexOf(TYPE_LITMUS_X86) == 0){ parser = new ParserLitmusX86(); } } if(parser != null){ - return parser.parse(charStream); + return parser.parse(chooser); } throw new ParsingException("Unknown input file type"); } -private String readFirstLine(String inputFilePath) throws IOException{ + private String readFirstLine(String inputFilePath) throws IOException{ File file = new File(inputFilePath); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index 9ce0cd13d1..16b506b520 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -73,7 +73,7 @@ public static void main(String[] args) throws IOException { Arch target = Arch.get(cmd.getOptionValue("target")); String inputFilePath = cmd.getOptionValue("input"); - if(!inputFilePath.endsWith("pts") && !inputFilePath.endsWith("litmus")) { + if(!inputFilePath.endsWith("pts")) { System.out.println("Unrecognized program format"); System.exit(0); return; @@ -101,8 +101,9 @@ public static void main(String[] args) throws IOException { Alias alias = Alias.get(cmd.getOptionValue("alias")); ProgramParser programParser = new ProgramParser(); - Program pSource = programParser.parse(inputFilePath); - Program pTarget = programParser.parse(inputFilePath); + // PORTHOS only supports pts + Program pSource = programParser.parse(inputFilePath, "pts"); + Program pTarget = programParser.parse(inputFilePath, "pts"); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index ac66b7d943..1b0a610f5a 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -30,7 +30,7 @@ public class Utils { public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { String path = TMPPROGPATH + loadedFormat; File tmpProgramFile = createTmpFile(editor, path); - Program p = new ProgramParser().parse(path); + Program p = new ProgramParser().parse(path, loadedFormat); tmpProgramFile.delete(); return p; } From b4230e0785b82dbd85bb3acf2e4f78a14412c2ad Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 23 Mar 2019 15:49:06 +0100 Subject: [PATCH 104/145] Updated tests --- .../java/com/dat3m/dartagnan/AbstractDartagnanTest.java | 3 ++- .../java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java | 3 ++- .../java/com/dat3m/dartagnan/DartagnanArrayValidTest.java | 3 ++- .../test/java/com/dat3m/dartagnan/DartagnanBranchTest.java | 3 ++- .../java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java | 3 ++- .../dartagnan/parsers/program/utils/ProgramBuilderTest.java | 3 ++- .../com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java | 3 ++- .../wmm/relation/basic/rmw/ExclusivePairsTest.java | 6 ++++-- porthos/src/test/java/com/dat3m/porthos/PorthosTest.java | 5 +++-- 9 files changed, 21 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java index 736b7c7936..5efdace1a2 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java @@ -62,7 +62,8 @@ static Iterable buildParameters(String litmusPath, String cat, Arch ta @Test public void test() { try { - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); if (program.getAss() != null) { Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java index d18fa70445..d458402052 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java @@ -36,7 +36,8 @@ public DartagnanArrayIllegalTest(String input) { @Test public void test() { try{ - new ProgramParser().parse(input); + // Only litmus are tested + new ProgramParser().parse(input, "litmus"); fail("Didn't throw an exception"); } catch(ParseCancellationException | ParsingException e){ // Test succeeded diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java index 071e01d915..3b58a596c9 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java @@ -46,7 +46,8 @@ public DartagnanArrayValidTest(String input, Wmm wmm) { @Test public void test() { try{ - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertTrue(Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 2, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java index 2eb3c03b23..af5da8437f 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java @@ -77,7 +77,8 @@ public DartagnanBranchTest(String input, boolean expected, Wmm wmm) { @Test public void test() { try{ - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertEquals(expected, Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 1, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java index 7adf4f3978..4b63d63046 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java @@ -82,7 +82,8 @@ public DartagnanUnrollWhileTest(String input, Wmm wmm, int bound, String[] names @Test public void test() { try { - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); program.setAss(mkAssert(program, names, values)); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java index 26a694a968..5971899765 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java @@ -19,7 +19,8 @@ public void testLabelsValidation() throws IOException { .filter(f -> (f.toString().endsWith("litmus"))) .forEach(f -> { try{ - new ProgramParser().parse(f.toString()); + // Only litmus are tested + new ProgramParser().parse(f.toString(), "litmus"); } catch(ParsingException e){ // Test succeeded } catch (IOException e){ diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java index 72afd25b75..8f92ec2520 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java @@ -57,7 +57,8 @@ public void test() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); // Force encoding all possible "crit" relations wmm.setDrawExecutionGraph(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java index 930cbc30d1..286466da6a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java @@ -69,7 +69,8 @@ public void testReachableStates() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); // Test final state assertEquals(expectedState, Dartagnan.testProgram(solver, ctx, program, wmm, program.getArch(), 1, Mode.KNASTER, Alias.CFIS)); @@ -98,7 +99,8 @@ public void testUnpredictableBehaviourFlag(){ try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + // Only litmus are tested + Program program = new ProgramParser().parse(input, "litmus"); // Add program without assertions program.unroll(1, 0); diff --git a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java index 8c5dd47cc2..33559e8d46 100644 --- a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java +++ b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java @@ -137,8 +137,9 @@ public PorthosTest(String input, boolean expected, Arch source, Arch target, Wmm public void test() { try { ProgramParser programParser = new ProgramParser(); - Program pSource = programParser.parse(input); - Program pTarget = programParser.parse(input); + // Only pts are tested + Program pSource = programParser.parse(input, "pts"); + Program pTarget = programParser.parse(input, "pts"); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); From 7970c20aaa9a1418d6db61c6b74a29c18b586ec7 Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 23 Mar 2019 15:55:03 +0100 Subject: [PATCH 105/145] endswith -> equals --- .../com/dat3m/dartagnan/parsers/program/ProgramParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index b4c565e94b..3073b81236 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -28,10 +28,10 @@ public Program parse(Object input, String format) throws IOException { throw new ParsingException("Unknown input file type"); } - if(format.endsWith("pts")){ + if(format.equals("pts")){ parser = new ParserPorthos(); - } else if(format.endsWith("litmus")){ + } else if(format.equals("litmus")){ if(chooser.indexOf(TYPE_LITMUS_AARCH64) == 0){ parser = new ParserLitmusAArch64(); } else if(chooser.indexOf(TYPE_LITMUS_C) == 0){ From 94c573c328026f6393b1719e03c335157573ca89 Mon Sep 17 00:00:00 2001 From: ponce Date: Sun, 24 Mar 2019 20:49:51 +0100 Subject: [PATCH 106/145] Ready to merge --- .../java/com/dat3m/dartagnan/Dartagnan.java | 3 +- .../parsers/program/ProgramParser.java | 39 ++++++++++------- .../dartagnan/AbstractDartagnanTest.java | 3 +- .../dartagnan/DartagnanArrayIllegalTest.java | 3 +- .../dartagnan/DartagnanArrayValidTest.java | 3 +- .../dat3m/dartagnan/DartagnanBranchTest.java | 3 +- .../dartagnan/DartagnanUnrollWhileTest.java | 3 +- .../program/utils/ProgramBuilderTest.java | 3 +- .../wmm/relation/basic/RelCritTest.java | 3 +- .../basic/rmw/ExclusivePairsTest.java | 6 +-- .../main/java/com/dat3m/porthos/Porthos.java | 5 +-- .../java/com/dat3m/porthos/PorthosTest.java | 5 +-- .../main/java/com/dat3m/ui/utils/Utils.java | 42 ------------------- 13 files changed, 37 insertions(+), 84 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index 61019d319b..eb9b775ca1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -67,8 +67,7 @@ public static void main(String[] args) throws IOException { Mode mode = Mode.get(cmd.getOptionValue("mode")); Alias alias = Alias.get(cmd.getOptionValue("alias")); - String format = inputFilePath.endsWith("pts") ? "pts" : "litmus"; - Program p = new ProgramParser().parse(inputFilePath, format); + Program p = new ProgramParser().parse(inputFilePath); Arch target = p.getArch(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 3073b81236..c1d02ef759 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -17,18 +17,29 @@ public class ProgramParser { private static final String TYPE_LITMUS_X86 = "X86"; private static final String TYPE_LITMUS_C = "C"; - public Program parse(Object input, String format) throws IOException { + public Program parse(String inputFilePath) throws IOException { ParserInterface parser = null; - String chooser = null; - if(input instanceof String) { - chooser = readFirstLine((String)input).toUpperCase(); - } else if(input instanceof CharStream) { - chooser = ((CharStream)input).toString().toUpperCase(); - } else { - throw new ParsingException("Unknown input file type"); + String format = inputFilePath.endsWith("pts") ? "pts" : "litmus"; + parser = parserResolver(readFirstLine(inputFilePath).toUpperCase(), format); + if(parser != null){ + return parser.parse(inputFilePath); + } + throw new ParsingException("Unknown input file type"); + } + + public Program parse(CharStream input, String format) throws IOException { + ParserInterface parser = null; + parser = parserResolver(input.toString().toUpperCase(), format); + if(parser != null){ + return parser.parse(input); } - - if(format.equals("pts")){ + throw new ParsingException("Unknown input file type"); + } + + public ParserInterface parserResolver(String chooser, String format) { + ParserInterface parser = null; + + if(format.equals("pts")){ parser = new ParserPorthos(); } else if(format.equals("litmus")){ @@ -42,12 +53,8 @@ public Program parse(Object input, String format) throws IOException { parser = new ParserLitmusX86(); } } - - if(parser != null){ - return parser.parse(chooser); - } - throw new ParsingException("Unknown input file type"); - } + return parser; + } private String readFirstLine(String inputFilePath) throws IOException{ File file = new File(inputFilePath); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java index 5efdace1a2..736b7c7936 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java @@ -62,8 +62,7 @@ static Iterable buildParameters(String litmusPath, String cat, Arch ta @Test public void test() { try { - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); if (program.getAss() != null) { Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java index d458402052..d18fa70445 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java @@ -36,8 +36,7 @@ public DartagnanArrayIllegalTest(String input) { @Test public void test() { try{ - // Only litmus are tested - new ProgramParser().parse(input, "litmus"); + new ProgramParser().parse(input); fail("Didn't throw an exception"); } catch(ParseCancellationException | ParsingException e){ // Test succeeded diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java index 3b58a596c9..071e01d915 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java @@ -46,8 +46,7 @@ public DartagnanArrayValidTest(String input, Wmm wmm) { @Test public void test() { try{ - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertTrue(Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 2, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java index af5da8437f..2eb3c03b23 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java @@ -77,8 +77,7 @@ public DartagnanBranchTest(String input, boolean expected, Wmm wmm) { @Test public void test() { try{ - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertEquals(expected, Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 1, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java index 4b63d63046..7adf4f3978 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java @@ -82,8 +82,7 @@ public DartagnanUnrollWhileTest(String input, Wmm wmm, int bound, String[] names @Test public void test() { try { - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); program.setAss(mkAssert(program, names, values)); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java index 5971899765..26a694a968 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java @@ -19,8 +19,7 @@ public void testLabelsValidation() throws IOException { .filter(f -> (f.toString().endsWith("litmus"))) .forEach(f -> { try{ - // Only litmus are tested - new ProgramParser().parse(f.toString(), "litmus"); + new ProgramParser().parse(f.toString()); } catch(ParsingException e){ // Test succeeded } catch (IOException e){ diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java index 8f92ec2520..72afd25b75 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java @@ -57,8 +57,7 @@ public void test() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); // Force encoding all possible "crit" relations wmm.setDrawExecutionGraph(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java index 286466da6a..930cbc30d1 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java @@ -69,8 +69,7 @@ public void testReachableStates() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); // Test final state assertEquals(expectedState, Dartagnan.testProgram(solver, ctx, program, wmm, program.getArch(), 1, Mode.KNASTER, Alias.CFIS)); @@ -99,8 +98,7 @@ public void testUnpredictableBehaviourFlag(){ try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - // Only litmus are tested - Program program = new ProgramParser().parse(input, "litmus"); + Program program = new ProgramParser().parse(input); // Add program without assertions program.unroll(1, 0); diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index 16b506b520..6d56ed19f3 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -101,9 +101,8 @@ public static void main(String[] args) throws IOException { Alias alias = Alias.get(cmd.getOptionValue("alias")); ProgramParser programParser = new ProgramParser(); - // PORTHOS only supports pts - Program pSource = programParser.parse(inputFilePath, "pts"); - Program pTarget = programParser.parse(inputFilePath, "pts"); + Program pSource = programParser.parse(inputFilePath); + Program pTarget = programParser.parse(inputFilePath); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java index 33559e8d46..8c5dd47cc2 100644 --- a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java +++ b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java @@ -137,9 +137,8 @@ public PorthosTest(String input, boolean expected, Arch source, Arch target, Wmm public void test() { try { ProgramParser programParser = new ProgramParser(); - // Only pts are tested - Program pSource = programParser.parse(input, "pts"); - Program pTarget = programParser.parse(input, "pts"); + Program pSource = programParser.parse(input); + Program pTarget = programParser.parse(input); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 1b0a610f5a..7c342c3b07 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -4,58 +4,16 @@ import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; import java.net.URL; -import javax.swing.JEditorPane; import javax.swing.JOptionPane; -import com.dat3m.dartagnan.parsers.cat.ParserCat; -import com.dat3m.dartagnan.parsers.program.ProgramParser; -import com.dat3m.dartagnan.program.Program; -import com.dat3m.dartagnan.wmm.Wmm; -import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.ui.Dat3M; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; public class Utils { - private static final String TMPPROGPATH = "./.tmp/program."; - private static final String TMPMMPATH = "./.tmp/mm.cat"; - - public static Program parseProgramEditor(JEditorPane editor, String loadedFormat) throws IOException { - String path = TMPPROGPATH + loadedFormat; - File tmpProgramFile = createTmpFile(editor, path); - Program p = new ProgramParser().parse(path, loadedFormat); - tmpProgramFile.delete(); - return p; - } - - public static Wmm parseMMEditor(JEditorPane editor, Arch target) throws IOException { - File tmpMMFile = createTmpFile(editor, TMPMMPATH); - Wmm mm = new ParserCat().parse(TMPMMPATH); - tmpMMFile.delete(); - return mm; - } - - private static File createTmpFile(JEditorPane editor, String path) throws IOException { - File tmpProgramFile = new File(path); - if (!tmpProgramFile.getParentFile().exists()) { - tmpProgramFile.getParentFile().mkdirs(); - } - if (!tmpProgramFile.exists()) { - tmpProgramFile.createNewFile(); - } - Writer writer = new PrintWriter(tmpProgramFile); - writer.write(editor.getText()); - writer.close(); - return tmpProgramFile; - } - public static int getMainScreenWidth() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); From f9dcf4dda58192e0ca7a9aea6ce0c3c09482cad8 Mon Sep 17 00:00:00 2001 From: ponce Date: Tue, 26 Mar 2019 22:59:55 +0100 Subject: [PATCH 107/145] Found error in Armv7 cat file --- cat/arm.cat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cat/arm.cat b/cat/arm.cat index d1bbac312d..88e21468b2 100644 --- a/cat/arm.cat +++ b/cat/arm.cat @@ -32,7 +32,7 @@ let ppo = (R*W & ic) | (R*R & ii) (* fences *) (**********) -let fence = isb +let fence = ish (* happens before *) let hb = ppo | fence | rfe @@ -40,7 +40,7 @@ acyclic hb (* prop *) let propbase = (fence | (rfe;fence));hb* -let prop = (W*W & propbase)| (com*;propbase*;isb;hb*) +let prop = (W*W & propbase)| (com*;propbase*;ish;hb*) acyclic co | prop irreflexive fre;prop;hb* From 6828214dae824fcaaaad074ff5d9b1d055d9b7d0 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Mar 2019 11:41:41 +0100 Subject: [PATCH 108/145] Better parsing error msg - Part 1 --- .../java/com/dat3m/dartagnan/parsers/cat/ParserCat.java | 2 ++ ui/src/main/java/com/dat3m/ui/Dat3M.java | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 8d0d4643a2..3249b301b7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.parsers.CatParser; import com.dat3m.dartagnan.parsers.CatLexer; import com.dat3m.dartagnan.parsers.cat.visitors.VisitorBase; +import com.dat3m.dartagnan.parsers.program.utils.ParserErrorListener; import com.dat3m.dartagnan.wmm.Wmm; import org.antlr.v4.runtime.*; @@ -26,6 +27,7 @@ public Wmm parse(CharStream charStream) throws IOException { CommonTokenStream tokenStream = new CommonTokenStream(lexer); CatParser parser = new CatParser(tokenStream); + parser.addErrorListener(new ParserErrorListener()); parser.setErrorHandler(new BailErrorStrategy()); ParserRuleContext parserEntryPoint = parser.mcm(); return (Wmm) parserEntryPoint.accept(new VisitorBase()); diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index dbafb60720..a960447838 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -127,14 +127,17 @@ private void runTest(){ Wmm sourceModel = new ParserCat().parse(smmStream); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); } catch (Exception e){ - showError("The source memory model was not imported or cannot be parsed", "Loading or parsing error"); + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError(msg, "Source memory model parsing error"); } } } catch (Exception e){ - showError("The target memory model was not imported or cannot be parsed", "Loading or parsing error"); + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError(msg, "Target memory model parsing error"); } } catch (Exception e){ - showError("The program was not imported or cannot be parsed", "Loading or parsing error"); + String msg = e.getMessage() == null? "Program cannot be parsed" : e.getMessage(); + showError(msg, "Program parsing error"); } if(testResult != null && testResult.isSat()) { graph.generate(testResult); From 26822dc14e9a4a4e6411ea517916a22bdfa986d6 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Mar 2019 13:17:40 +0100 Subject: [PATCH 109/145] Added line number in editors --- .../main/java/com/dat3m/ui/editor/Editor.java | 4 + .../com/dat3m/ui/editor/LineNumbersView.java | 150 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index 49e61a3335..1a256f0e12 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -25,6 +25,7 @@ public class Editor extends JScrollPane implements ActionListener { private final JEditorPane editorPane; private final JMenuItem menuItem; private final JFileChooser chooser; + private final LineNumbersView lineNumbers; private final ImmutableSet allowedFormats; private String loadedFormat = ""; @@ -35,6 +36,8 @@ public class Editor extends JScrollPane implements ActionListener { super(editorPane); this.code = code; this.editorPane = editorPane; + this.lineNumbers = new LineNumbersView(editorPane); + this.addActionListener(lineNumbers); this.menuItem = new JMenuItem(code.toString()); menuItem.setActionCommand(code.editorMenuActionCommand()); menuItem.addActionListener(this); @@ -45,6 +48,7 @@ public class Editor extends JScrollPane implements ActionListener { chooser.addChoosableFileFilter(new FileNameExtensionFilter("*." + format, format)); } + setRowHeaderView(lineNumbers); setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); diff --git a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java new file mode 100644 index 0000000000..caba5245cb --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java @@ -0,0 +1,150 @@ +package com.dat3m.ui.editor; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; + +import javax.swing.JComponent; +import javax.swing.SwingUtilities; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.text.BadLocationException; +import javax.swing.text.Element; +import javax.swing.text.JTextComponent; +import javax.swing.text.Utilities; + +class LineNumbersView extends JComponent implements CaretListener, ComponentListener, ActionListener { + + private JTextComponent editor; + private Font font; + + public LineNumbersView(JTextComponent editor) { + this.editor = editor; + editor.addComponentListener(this); + editor.addCaretListener(this); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + Rectangle clip = g.getClipBounds(); + int startOffset = editor.viewToModel(new Point(0, clip.y)); + int endOffset = editor.viewToModel(new Point(0, clip.y + clip.height)); + + while (startOffset <= endOffset) { + try { + String lineNumber = getLineNumber(startOffset); + if (lineNumber != null) { + int x = getInsets().left + 2; + int y = getOffsetY(startOffset); + + font = font != null ? font : new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize()); + g.setFont(font); + + g.setColor(isCurrentLine(startOffset) ? Color.RED : Color.BLACK); + + g.drawString(lineNumber, x, y); + } + + startOffset = Utilities.getRowEnd(editor, startOffset) + 1; + } catch (BadLocationException e) { + e.printStackTrace(); + // ignore and continue + } + } + } + + /** + * Returns the line number of the element based on the given (start) offset + * in the editor model. Returns null if no line number should or could be + * provided (e.g. for wrapped lines). + */ + private String getLineNumber(int offset) { + Element root = editor.getDocument().getDefaultRootElement(); + int index = root.getElementIndex(offset); + Element line = root.getElement(index); + + return line.getStartOffset() == offset ? String.format("%3d", index + 1) : null; + } + + /** + * Returns the y axis position for the line number belonging to the element + * at the given (start) offset in the model. + */ + private int getOffsetY(int offset) throws BadLocationException { + FontMetrics fontMetrics = editor.getFontMetrics(editor.getFont()); + int descent = fontMetrics.getDescent(); + + Rectangle r = editor.modelToView(offset); + int y = r.y + r.height - descent; + + return y; + } + + /** + * Returns true if the given start offset in the model is the selected (by + * cursor position) element. + */ + private boolean isCurrentLine(int offset) { + int caretPosition = editor.getCaretPosition(); + Element root = editor.getDocument().getDefaultRootElement(); + return root.getElementIndex(offset) == root.getElementIndex(caretPosition); + } + + /** + * Schedules a refresh of the line number margin on a separate thread. + */ + private void documentChanged() { + SwingUtilities.invokeLater(() -> { + repaint(); + }); + } + + /** + * Updates the size of the line number margin based on the editor height. + */ + private void updateSize() { + Dimension size = new Dimension(28, editor.getHeight()); + setPreferredSize(size); + setSize(size); + } + + @Override + public void caretUpdate(CaretEvent e) { + documentChanged(); + } + + @Override + public void componentResized(ComponentEvent e) { + updateSize(); + documentChanged(); + } + + @Override + public void componentMoved(ComponentEvent e) { + } + + @Override + public void componentShown(ComponentEvent e) { + updateSize(); + documentChanged(); + } + + @Override + public void componentHidden(ComponentEvent e) { + } + + @Override + public void actionPerformed(ActionEvent e) { + documentChanged(); + } + } \ No newline at end of file From 44910f03b313d7d1f6385e069cf9e94caa633cc0 Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Mar 2019 13:17:59 +0100 Subject: [PATCH 110/145] Allow to resize MM editors --- ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index b958471700..26f5a88a82 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -66,6 +66,7 @@ public void actionPerformed(ActionEvent event) { JComboBox selector = (JComboBox)event.getSource(); if(selector.getModel().getSelectedItem().equals(Task.PORTABILITY)){ mmPane.setTopComponent(editors.get(EditorCode.SOURCE_MM)); + mmPane.setDividerSize(2); mmPane.setDividerLocation(0.5); menu.add(editors.get(EditorCode.SOURCE_MM).getMenuItem(), 1); } else { From c51ac7e31bce13e23ab74dc93d7260c424a6dc1b Mon Sep 17 00:00:00 2001 From: ponce Date: Wed, 27 Mar 2019 14:45:28 +0100 Subject: [PATCH 111/145] Improved parsing errors - Part 2 --- .../java/com/dat3m/dartagnan/parsers/cat/ParserCat.java | 1 - ui/src/main/java/com/dat3m/ui/Dat3M.java | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 3249b301b7..5c2704d2bf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -28,7 +28,6 @@ public Wmm parse(CharStream charStream) throws IOException { CatParser parser = new CatParser(tokenStream); parser.addErrorListener(new ParserErrorListener()); - parser.setErrorHandler(new BailErrorStrategy()); ParserRuleContext parserEntryPoint = parser.mcm(); return (Wmm) parserEntryPoint.accept(new VisitorBase()); } diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a960447838..e5cf783290 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -128,16 +128,16 @@ private void runTest(){ testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); } catch (Exception e){ String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError(msg, "Source memory model parsing error"); + showError(msg, "Source memory model error"); } } } catch (Exception e){ String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError(msg, "Target memory model parsing error"); + showError(msg, "Target memory model error"); } } catch (Exception e){ String msg = e.getMessage() == null? "Program cannot be parsed" : e.getMessage(); - showError(msg, "Program parsing error"); + showError(msg, "Program error"); } if(testResult != null && testResult.isSat()) { graph.generate(testResult); From 9431c218977f539fa536367ca5f2f4455bdfd3b8 Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Mar 2019 23:34:24 +0100 Subject: [PATCH 112/145] Added relations selector for graph --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 36 +++++---- .../main/java/com/dat3m/ui/editor/Editor.java | 24 ++++++ .../java/com/dat3m/ui/graph/GraphOption.java | 61 ++++++++++++++- .../java/com/dat3m/ui/graph/RelSelector.java | 75 +++++++++++++++++++ .../dat3m/ui/result/PortabilityResult.java | 6 +- .../dat3m/ui/result/ReachabilityResult.java | 6 +- 6 files changed, 184 insertions(+), 24 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/graph/RelSelector.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e5cf783290..a6aa0f700a 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -1,10 +1,9 @@ package com.dat3m.ui; -import com.dat3m.dartagnan.parsers.cat.ParserCat; -import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.ui.editor.EditorsPane; +import com.dat3m.ui.editor.Editor; import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; @@ -20,9 +19,6 @@ import javax.swing.*; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; - import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -35,8 +31,8 @@ public class Dat3M extends JFrame implements ActionListener { private final OptionsPane optionsPane = new OptionsPane(); private final EditorsPane editorsPane = new EditorsPane(); - private final GraphOption graph = new GraphOption(); - + private final GraphOption graph = new GraphOption(optionsPane, editorsPane); + private Dat3mResult testResult; private Dat3M() { @@ -50,6 +46,7 @@ private Dat3M() { JMenuBar menuBar = new JMenuBar(); menuBar.add(editorsPane.getMenu()); + menuBar.add(graph.getMenu()); setJMenuBar(menuBar); JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editorsPane.getMainPane()); @@ -106,26 +103,27 @@ private void runTest(){ Options options = optionsPane.getOptions(); testResult = null; try { - String loadedFormat = editorsPane.getEditor(EditorCode.PROGRAM).getLoadedFormat(); - CharStream programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); - Program program = new ProgramParser().parse(programStream, loadedFormat); + Editor programEditor = editorsPane.getEditor(EditorCode.PROGRAM); + programEditor.load(); + Program program = (Program) programEditor.getLoaded(); try { - CharStream tmmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.TARGET_MM).getText()); - Wmm targetModel = new ParserCat().parse(tmmStream); + Editor targetEditor = editorsPane.getEditor(EditorCode.TARGET_MM); + targetEditor.load(); + Wmm targetModel = (Wmm) targetEditor.getLoaded(); if(options.getTask() == Task.REACHABILITY){ - testResult = new ReachabilityResult(program, targetModel, options); + testResult = new ReachabilityResult(program, targetModel, options, graph); } else { try { - if(!loadedFormat.equals("pts")) { + if(!programEditor.getLoadedFormat().equals("pts")) { showError("PORTHOS only supports *.pts files", "Loading error"); return; } // We need to create the stream again to be read from the beginning - programStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.PROGRAM).getText()); - Program sourceProgram = new ProgramParser().parse(programStream, loadedFormat); - CharStream smmStream = CharStreams.fromString(editorsPane.getEditor(EditorCode.SOURCE_MM).getText()); - Wmm sourceModel = new ParserCat().parse(smmStream); - testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); + Program sourceProgram = (Program) programEditor.getLoaded(); + Editor sourceEditor = editorsPane.getEditor(EditorCode.SOURCE_MM); + sourceEditor.load(); + Wmm sourceModel = (Wmm) sourceEditor.getLoaded(); + testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options, graph); } catch (Exception e){ String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); showError(msg, "Source memory model error"); diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index 1a256f0e12..d829a84efd 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -1,10 +1,15 @@ package com.dat3m.ui.editor; +import com.dat3m.dartagnan.parsers.cat.ParserCat; +import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.google.common.collect.ImmutableSet; import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileNameExtensionFilter; + +import org.antlr.v4.runtime.CharStreams; + import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -13,6 +18,9 @@ import java.io.InputStreamReader; import java.util.*; +import static com.dat3m.ui.editor.EditorCode.PROGRAM; +import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; +import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static com.dat3m.ui.utils.Utils.showError; import static java.lang.System.getProperty; import static javax.swing.BorderFactory.createTitledBorder; @@ -22,6 +30,8 @@ public class Editor extends JScrollPane implements ActionListener { private final EditorCode code; + private Object loaded; + private final JEditorPane editorPane; private final JMenuItem menuItem; private final JFileChooser chooser; @@ -69,6 +79,20 @@ public String getText(){ return editorPane.getText(); } + public void load() throws IOException { + if(code.equals(PROGRAM)) { + loaded = new ProgramParser().parse(CharStreams.fromString(getText()), loadedFormat); + } else if(code.equals(SOURCE_MM)) { + loaded = new ParserCat().parse(CharStreams.fromString(getText())); + } else if(code.equals(TARGET_MM)) { + loaded = new ParserCat().parse(CharStreams.fromString(getText())); + } + } + + public Object getLoaded() { + return loaded; + } + @Override public void actionPerformed(ActionEvent event) { if(code.editorMenuActionCommand().equals(event.getActionCommand())){ diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 0a4d42c7a2..27c26a10ac 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -1,36 +1,70 @@ package com.dat3m.ui.graph; +import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; +import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; import static java.awt.Toolkit.getDefaultToolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; - import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuItem; import javax.swing.JScrollPane; import com.dat3m.dartagnan.utils.Graph; +import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.ui.editor.EditorsPane; +import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.result.Dat3mResult; +import com.dat3m.ui.utils.Task; + import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; -public class GraphOption { +public class GraphOption implements ActionListener { private File dotFile = new File(".tmp/output.dot"); private File pngFile = new File(".tmp/output.png"); + private final OptionsPane options; + private final EditorsPane editor; + private final JMenu menu; + private final RelSelector selector; + + public GraphOption(OptionsPane options, EditorsPane editor) { + this.options = options; + this.editor = editor; + this.menu = new JMenu("Graph Options"); + JMenuItem menuItem = new JMenuItem("Select Displayed Relations"); + menuItem.setActionCommand("menu_graph_relations"); + menuItem.addActionListener(this); + this.menu.add(menuItem); + this.selector = new RelSelector(); + } + + public JMenu getMenu(){ + return menu; + } + + public RelSelector getSelector(){ + return selector; + } + public void generate(Dat3mResult res) { try { if(res.isSat()) { List files = Arrays.asList(dotFile, pngFile); - // Create the file and parent directry if they do not exist + // Create the file and parent directory if they do not exist for(File f : files) { if (f.getParentFile() != null) { f.getParentFile().mkdirs(); @@ -62,4 +96,25 @@ public void open() { frame.pack(); frame.setVisible(true); } + + @Override + public void actionPerformed(ActionEvent event) { + if(event.getActionCommand().equals("menu_graph_relations")){ + try { + editor.getEditor(TARGET_MM).load(); + selector.setTMM((Wmm) editor.getEditor(TARGET_MM).getLoaded()); + } catch (Exception e) { + // Nothing to be done + } + if(options.getOptions().getTask().equals(Task.PORTABILITY)) { + try { + editor.getEditor(SOURCE_MM).load(); + selector.setSMM((Wmm) editor.getEditor(SOURCE_MM).getLoaded()); + } catch (Exception e) { + // Nothing to be done + } + } + selector.open(); + } + } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java new file mode 100644 index 0000000000..a7efd3b8b6 --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -0,0 +1,75 @@ +package com.dat3m.ui.graph; + +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JRadioButton; + +import com.dat3m.dartagnan.wmm.Wmm; + +public class RelSelector extends JFrame implements ActionListener { + + private Wmm tmm; + private Wmm smm; + private Set selection = new HashSet<>(); + + public void setTMM(Wmm mm) { + this.tmm = mm; + } + + public void setSMM(Wmm mm) { + this.smm = mm; + } + + public Set getSelection() { + return selection; + } + + public void open() { + JPanel radioPanel = new JPanel(new GridLayout(0, 1)); + int nButton = 0; + + nButton = createButtons(tmm, radioPanel, nButton); + nButton = createButtons(smm, radioPanel, nButton); + + nButton = Math.max(nButton, 2); + radioPanel.setPreferredSize(new Dimension(200, nButton * 30)); + setContentPane(radioPanel); + pack(); + setVisible(true); + } + + public int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { + if(mm != null) { + Set rels = mm.getRelationRepository().getRelations().stream() + .filter(ev -> !ev.getName().equals(ev.getTerm())) + .map(ev -> ev.getName()).collect(Collectors.toSet()); + for(String name : rels) { + JRadioButton button = new JRadioButton(name); + button.setName(name); + button.addActionListener(this); + button.setSelected(selection.contains(name)); + radioPanel.add(button); + nButtom ++; + } + } + return nButtom; + } + + @Override + public void actionPerformed(ActionEvent e) { + JRadioButton button = (JRadioButton)e.getSource(); + if(button.isSelected()) { + selection.add(button.getName()); + } else { + selection.remove(button.getName()); + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index bf2e8ad83b..f433f3351e 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; +import com.dat3m.ui.graph.GraphOption; import com.dat3m.ui.options.Options; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; @@ -18,15 +19,17 @@ public class PortabilityResult implements Dat3mResult { private final Options options; private boolean isSat = false; + private GraphOption gOptions; private Graph graph; private String verdict; - public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourceWmm, Wmm targetWmm, Options options){ + public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourceWmm, Wmm targetWmm, Options options, GraphOption gOptions){ this.sourceProgram = sourceProgram; this.targetProgram = targetProgram; this.sourceWmm = sourceWmm; this.targetWmm = targetWmm; this.options = options; + this.gOptions = gOptions; run(); } @@ -59,6 +62,7 @@ private void run(){ if(!result.getIsPortable()){ graph = new Graph(s1.getModel(), ctx); + graph.addRelations(gOptions.getSelector().getSelection()); graph.build(sourceProgram, targetProgram); isSat = true; } diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index e290e8ffcb..f39bd88560 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.utils.Graph; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; +import com.dat3m.ui.graph.GraphOption; import com.dat3m.ui.options.Options; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; @@ -16,12 +17,14 @@ public class ReachabilityResult implements Dat3mResult { private final Options options; private boolean isSat = false; + private GraphOption gOptions; private Graph graph; private String verdict; - public ReachabilityResult(Program program, Wmm wmm, Options options){ + public ReachabilityResult(Program program, Wmm wmm, Options options, GraphOption gOptions){ this.program = program; this.wmm = wmm; + this.gOptions = gOptions; this.options = options; run(); } @@ -49,6 +52,7 @@ private void run(){ if(Dartagnan.canDrawGraph(program.getAss(), result)){ graph = new Graph(solver.getModel(), ctx); + graph.addRelations(gOptions.getSelector().getSelection()); graph.build(program); isSat = true; } From 0e1f37e85520ef87c57d99ea472c2218d957d3ce Mon Sep 17 00:00:00 2001 From: ponce Date: Thu, 28 Mar 2019 23:43:05 +0100 Subject: [PATCH 113/145] Fixed bug in rel selector --- ui/src/main/java/com/dat3m/ui/graph/GraphOption.java | 3 +-- ui/src/main/java/com/dat3m/ui/graph/RelSelector.java | 11 +++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 27c26a10ac..5a666eb342 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -39,7 +39,7 @@ public class GraphOption implements ActionListener { private final OptionsPane options; private final EditorsPane editor; private final JMenu menu; - private final RelSelector selector; + private final RelSelector selector = new RelSelector(); public GraphOption(OptionsPane options, EditorsPane editor) { this.options = options; @@ -49,7 +49,6 @@ public GraphOption(OptionsPane options, EditorsPane editor) { menuItem.setActionCommand("menu_graph_relations"); menuItem.addActionListener(this); this.menu.add(menuItem); - this.selector = new RelSelector(); } public JMenu getMenu(){ diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index a7efd3b8b6..f842052c73 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -18,6 +18,7 @@ public class RelSelector extends JFrame implements ActionListener { private Wmm tmm; private Wmm smm; + private Set names; private Set selection = new HashSet<>(); public void setTMM(Wmm mm) { @@ -33,6 +34,7 @@ public Set getSelection() { } public void open() { + names = new HashSet<>(); JPanel radioPanel = new JPanel(new GridLayout(0, 1)); int nButton = 0; @@ -52,6 +54,10 @@ public int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { .filter(ev -> !ev.getName().equals(ev.getTerm())) .map(ev -> ev.getName()).collect(Collectors.toSet()); for(String name : rels) { + if(names.contains(name)) { + continue; + } + names.add(name); JRadioButton button = new JRadioButton(name); button.setName(name); button.addActionListener(this); @@ -66,10 +72,11 @@ public int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { @Override public void actionPerformed(ActionEvent e) { JRadioButton button = (JRadioButton)e.getSource(); + String name = button.getName(); if(button.isSelected()) { - selection.add(button.getName()); + selection.add(name); } else { - selection.remove(button.getName()); + selection.remove(name); } } } From caf5ed7a32647323fcf1a8598218a05b421bc847 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 29 Mar 2019 09:29:08 +0100 Subject: [PATCH 114/145] Rel selection - Done --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 3 +-- .../java/com/dat3m/ui/graph/GraphOption.java | 18 ++++-------------- .../java/com/dat3m/ui/graph/RelSelector.java | 4 ++++ 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index a6aa0f700a..ab0a2f6a53 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -31,7 +31,7 @@ public class Dat3M extends JFrame implements ActionListener { private final OptionsPane optionsPane = new OptionsPane(); private final EditorsPane editorsPane = new EditorsPane(); - private final GraphOption graph = new GraphOption(optionsPane, editorsPane); + private final GraphOption graph = new GraphOption(editorsPane); private Dat3mResult testResult; @@ -118,7 +118,6 @@ private void runTest(){ showError("PORTHOS only supports *.pts files", "Loading error"); return; } - // We need to create the stream again to be read from the beginning Program sourceProgram = (Program) programEditor.getLoaded(); Editor sourceEditor = editorsPane.getEditor(EditorCode.SOURCE_MM); sourceEditor.load(); diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 5a666eb342..0b9bed404d 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -24,10 +24,7 @@ import com.dat3m.dartagnan.utils.Graph; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.ui.editor.EditorsPane; -import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.result.Dat3mResult; -import com.dat3m.ui.utils.Task; - import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; @@ -36,13 +33,12 @@ public class GraphOption implements ActionListener { private File dotFile = new File(".tmp/output.dot"); private File pngFile = new File(".tmp/output.png"); - private final OptionsPane options; + // We need to load the MMs to populate the relation selector in the menu private final EditorsPane editor; private final JMenu menu; private final RelSelector selector = new RelSelector(); - public GraphOption(OptionsPane options, EditorsPane editor) { - this.options = options; + public GraphOption(EditorsPane editor) { this.editor = editor; this.menu = new JMenu("Graph Options"); JMenuItem menuItem = new JMenuItem("Select Displayed Relations"); @@ -102,17 +98,11 @@ public void actionPerformed(ActionEvent event) { try { editor.getEditor(TARGET_MM).load(); selector.setTMM((Wmm) editor.getEditor(TARGET_MM).getLoaded()); + editor.getEditor(SOURCE_MM).load(); + selector.setSMM((Wmm) editor.getEditor(SOURCE_MM).getLoaded()); } catch (Exception e) { // Nothing to be done } - if(options.getOptions().getTask().equals(Task.PORTABILITY)) { - try { - editor.getEditor(SOURCE_MM).load(); - selector.setSMM((Wmm) editor.getEditor(SOURCE_MM).getLoaded()); - } catch (Exception e) { - // Nothing to be done - } - } selector.open(); } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index f842052c73..190e3ee251 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -18,6 +18,7 @@ public class RelSelector extends JFrame implements ActionListener { private Wmm tmm; private Wmm smm; + // To avoid repeating names of common relations between both MM private Set names; private Set selection = new HashSet<>(); @@ -36,11 +37,13 @@ public Set getSelection() { public void open() { names = new HashSet<>(); JPanel radioPanel = new JPanel(new GridLayout(0, 1)); + // To have the height based on the number of options int nButton = 0; nButton = createButtons(tmm, radioPanel, nButton); nButton = createButtons(smm, radioPanel, nButton); + // To have a minimal height when there are no relations nButton = Math.max(nButton, 2); radioPanel.setPreferredSize(new Dimension(200, nButton * 30)); setContentPane(radioPanel); @@ -61,6 +64,7 @@ public int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { JRadioButton button = new JRadioButton(name); button.setName(name); button.addActionListener(this); + // To remember previous choice button.setSelected(selection.contains(name)); radioPanel.add(button); nButtom ++; From c0044aeb701cd75a219b08acad05e45f437b6619 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Wed, 3 Apr 2019 10:45:10 +0200 Subject: [PATCH 115/145] More detailed error msg for program parsers --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index ab0a2f6a53..304d9bbc0e 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -16,13 +16,14 @@ import com.dat3m.ui.result.PortabilityResult; import com.dat3m.ui.result.ReachabilityResult; import com.dat3m.ui.utils.Task; - import javax.swing.*; +import org.antlr.v4.runtime.InputMismatchException; +import org.antlr.v4.runtime.Token; + import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; - import static com.dat3m.ui.utils.Utils.showError; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.UIManager.getDefaults; @@ -134,7 +135,12 @@ private void runTest(){ } } catch (Exception e){ String msg = e.getMessage() == null? "Program cannot be parsed" : e.getMessage(); - showError(msg, "Program error"); + Throwable cause = e.getCause(); + if(cause instanceof InputMismatchException) { + Token token = ((InputMismatchException)cause).getOffendingToken(); + msg = "Problem with \"" + token.getText() + "\" at line " + token.getLine(); + } + showError(msg, "Program error"); } if(testResult != null && testResult.isSat()) { graph.generate(testResult); From e57ce8721e7aaed0fd28af67d21e4a4ef1b316d2 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 5 Apr 2019 14:52:47 +0300 Subject: [PATCH 116/145] Parsers: part 1 --- .../java/com/dat3m/dartagnan/Dartagnan.java | 3 +- .../dartagnan/parsers/cat/ParserCat.java | 20 +++--- .../parsers/program/ParserInterface.java | 7 +- .../parsers/program/ParserLitmusAArch64.java | 23 ++----- .../parsers/program/ParserLitmusC.java | 20 +----- .../parsers/program/ParserLitmusPPC.java | 23 ++----- .../parsers/program/ParserLitmusX86.java | 23 ++----- .../parsers/program/ParserPorthos.java | 24 ++----- .../parsers/program/ProgramParser.java | 65 ++++++++++--------- .../dartagnan/AbstractDartagnanTest.java | 3 +- .../dartagnan/DartagnanArrayValidTest.java | 3 +- .../dat3m/dartagnan/DartagnanBranchTest.java | 5 +- .../dartagnan/DartagnanUnrollWhileTest.java | 3 +- .../wmm/relation/basic/RelCritTest.java | 3 +- .../basic/rmw/ExclusivePairsTest.java | 3 +- .../main/java/com/dat3m/porthos/Porthos.java | 5 +- .../java/com/dat3m/porthos/PorthosTest.java | 9 +-- .../main/java/com/dat3m/ui/editor/Editor.java | 14 ++-- 18 files changed, 92 insertions(+), 164 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index eb9b775ca1..a33dd52a0c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -15,6 +15,7 @@ import com.dat3m.dartagnan.wmm.Wmm; import org.apache.commons.cli.*; +import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -85,7 +86,7 @@ public static void main(String[] args) throws IOException { throw new RuntimeException("Assert is required for Dartagnan tests"); } - Wmm mcm = new ParserCat().parse(cmd.getOptionValue("cat")); + Wmm mcm = new ParserCat().parse(new File(cmd.getOptionValue("cat"))); if(cmd.hasOption("draw")) { mcm.setDrawExecutionGraph(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 5c2704d2bf..1db6818934 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -13,22 +13,26 @@ public class ParserCat { - public Wmm parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); + public Wmm parse(File file) throws IOException { FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Wmm wmm = parse(charStream); + Wmm wmm = parse(CharStreams.fromStream(stream)); stream.close(); return wmm; } - public Wmm parse(CharStream charStream) throws IOException { - CatLexer lexer = new CatLexer(charStream); + public Wmm parse(String raw) { + return parse(CharStreams.fromString(raw)); + } + + private Wmm parse(CharStream charStream){ + CatLexer lexer = new CatLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); CatParser parser = new CatParser(tokenStream); + // TODO: Why error handler was removed? + // parser.setErrorHandler(new BailErrorStrategy()); parser.addErrorListener(new ParserErrorListener()); ParserRuleContext parserEntryPoint = parser.mcm(); return (Wmm) parserEntryPoint.accept(new VisitorBase()); - } -} \ No newline at end of file + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java index 35d621d7ef..40a91ee631 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java @@ -1,14 +1,9 @@ package com.dat3m.dartagnan.parsers.program; import com.dat3m.dartagnan.program.Program; - -import java.io.IOException; - import org.antlr.v4.runtime.CharStream; public interface ParserInterface { - Program parse(String inputFilePath) throws IOException; - - Program parse(CharStream charStream) throws IOException; + Program parse(CharStream charStream); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java index 233b1df602..01a5364744 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java @@ -10,26 +10,11 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusAArch64 implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program p = parse(charStream); - stream.close(); - p.setName(inputFilePath); - return p; - } - - @Override - public Program parse(CharStream charStream) throws IOException { - LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); + public Program parse(CharStream charStream) { + LitmusAArch64Lexer lexer = new LitmusAArch64Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusAArch64Parser parser = new LitmusAArch64Parser(tokenStream); @@ -42,5 +27,5 @@ public Program parse(CharStream charStream) throws IOException { Program program = (Program) parserEntryPoint.accept(visitor); program.setArch(Arch.ARM8); return program; - } -} \ No newline at end of file + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 101c29ceb7..5a1e8a48ec 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -9,25 +9,11 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusC implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program p = parse(charStream); - stream.close(); - p.setName(inputFilePath); - return p; - } - - public Program parse(CharStream charStream) throws IOException { - LitmusCLexer lexer = new LitmusCLexer(charStream); + public Program parse(CharStream charStream) { + LitmusCLexer lexer = new LitmusCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusCParser parser = new LitmusCParser(tokenStream); @@ -39,5 +25,5 @@ public Program parse(CharStream charStream) throws IOException { Program program = (Program) parserEntryPoint.accept(visitor); program.setArch(Arch.NONE); return program; - } + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java index 8ae9b7115c..a52572417c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java @@ -10,26 +10,11 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusPPC implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program p = parse(charStream); - stream.close(); - p.setName(inputFilePath); - return p; - } - - @Override - public Program parse(CharStream charStream) throws IOException { - LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); + public Program parse(CharStream charStream) { + LitmusPPCLexer lexer = new LitmusPPCLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusPPCParser parser = new LitmusPPCParser(tokenStream); @@ -42,5 +27,5 @@ public Program parse(CharStream charStream) throws IOException { Program program = (Program) parserEntryPoint.accept(visitor); program.setArch(Arch.POWER); return program; - } -} \ No newline at end of file + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java index 308d263621..32e27b9d8a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java @@ -10,28 +10,13 @@ import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserLitmusX86 implements ParserInterface { @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program p = parse(charStream); - stream.close(); - p.setName(inputFilePath); - return p; - } - - @Override - public Program parse(CharStream charStream) throws IOException { - LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); + public Program parse(CharStream charStream) { + LitmusX86Lexer lexer = new LitmusX86Lexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - + LitmusX86Parser parser = new LitmusX86Parser(tokenStream); parser.addErrorListener(new DiagnosticErrorListener(true)); parser.addErrorListener(new ParserErrorListener()); @@ -42,5 +27,5 @@ public Program parse(CharStream charStream) throws IOException { Program program = (Program) parserEntryPoint.accept(visitor); program.setArch(Arch.TSO); return program; - } + } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java index 05928214de..9998e6feae 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java @@ -8,26 +8,11 @@ import com.dat3m.dartagnan.program.Program; import org.antlr.v4.runtime.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - public class ParserPorthos implements ParserInterface{ @Override - public Program parse(String inputFilePath) throws IOException { - File file = new File(inputFilePath); - FileInputStream stream = new FileInputStream(file); - CharStream charStream = CharStreams.fromStream(stream); - Program p = parse(charStream); - stream.close(); - p.setName(inputFilePath); - return p; - } - - @Override - public Program parse(CharStream charStream) throws IOException { - PorthosLexer lexer = new PorthosLexer(charStream); + public Program parse(CharStream charStream) { + PorthosLexer lexer = new PorthosLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); PorthosParser parser = new PorthosParser(tokenStream); @@ -37,7 +22,6 @@ public Program parse(CharStream charStream) throws IOException { ParserRuleContext parserEntryPoint = parser.main(); VisitorPorthos visitor = new VisitorPorthos(pb); - Program program = (Program) parserEntryPoint.accept(visitor); - return program; - } + return (Program) parserEntryPoint.accept(visitor); + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index c1d02ef759..cf69c36777 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -3,12 +3,10 @@ import com.dat3m.dartagnan.parsers.program.utils.ParsingException; import com.dat3m.dartagnan.program.Program; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; +import java.io.*; import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; public class ProgramParser { @@ -18,43 +16,46 @@ public class ProgramParser { private static final String TYPE_LITMUS_C = "C"; public Program parse(String inputFilePath) throws IOException { - ParserInterface parser = null; - String format = inputFilePath.endsWith("pts") ? "pts" : "litmus"; - parser = parserResolver(readFirstLine(inputFilePath).toUpperCase(), format); - if(parser != null){ - return parser.parse(inputFilePath); + ParserInterface parser = getConcreteParser(inputFilePath); + File file = new File(inputFilePath); + FileInputStream stream = new FileInputStream(file); + CharStream charStream = CharStreams.fromStream(stream); + Program program = parser.parse(charStream); + stream.close(); + program.setName(inputFilePath); + return program; + } + + public Program parse(String raw, String format) { + if(format.equals("pts")){ + return new ParserPorthos().parse(CharStreams.fromString(raw)); + } else if(format.equals("litmus")){ + return getConcreteLitmusParser(raw).parse(CharStreams.fromString(raw)); } throw new ParsingException("Unknown input file type"); } - public Program parse(CharStream input, String format) throws IOException { - ParserInterface parser = null; - parser = parserResolver(input.toString().toUpperCase(), format); - if(parser != null){ - return parser.parse(input); + private ParserInterface getConcreteParser(String inputFilePath) throws IOException { + if(inputFilePath.endsWith("pts")){ + return new ParserPorthos(); + } else if(inputFilePath.endsWith("litmus")){ + return getConcreteLitmusParser(readFirstLine(inputFilePath).toUpperCase()); } throw new ParsingException("Unknown input file type"); } - public ParserInterface parserResolver(String chooser, String format) { - ParserInterface parser = null; - - if(format.equals("pts")){ - parser = new ParserPorthos(); - - } else if(format.equals("litmus")){ - if(chooser.indexOf(TYPE_LITMUS_AARCH64) == 0){ - parser = new ParserLitmusAArch64(); - } else if(chooser.indexOf(TYPE_LITMUS_C) == 0){ - parser = new ParserLitmusC(); - } else if(chooser.indexOf(TYPE_LITMUS_PPC) == 0){ - parser = new ParserLitmusPPC(); - } else if(chooser.indexOf(TYPE_LITMUS_X86) == 0){ - parser = new ParserLitmusX86(); - } + private ParserInterface getConcreteLitmusParser(String programText){ + if(programText.indexOf(TYPE_LITMUS_AARCH64) == 0){ + return new ParserLitmusAArch64(); + } else if(programText.indexOf(TYPE_LITMUS_C) == 0){ + return new ParserLitmusC(); + } else if(programText.indexOf(TYPE_LITMUS_PPC) == 0){ + return new ParserLitmusPPC(); + } else if(programText.indexOf(TYPE_LITMUS_X86) == 0){ + return new ParserLitmusX86(); } - return parser; - } + throw new ParsingException("Unknown input file type"); + } private String readFirstLine(String inputFilePath) throws IOException{ File file = new File(inputFilePath); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java index 736b7c7936..246048669e 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java @@ -12,6 +12,7 @@ import com.microsoft.z3.Solver; import org.junit.Test; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -27,7 +28,7 @@ public abstract class AbstractDartagnanTest { static Iterable buildParameters(String litmusPath, String cat, Arch target, int unroll) throws IOException { int n = ResourceHelper.LITMUS_RESOURCE_PATH.length(); Map expectationMap = ResourceHelper.getExpectedResults(); - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + cat); + Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + cat)); return Files.walk(Paths.get(ResourceHelper.LITMUS_RESOURCE_PATH + litmusPath)) .filter(Files::isRegularFile) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java index 071e01d915..d0e474223a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java @@ -14,6 +14,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -27,7 +28,7 @@ public class DartagnanArrayValidTest { @Parameterized.Parameters(name = "{index}: {0}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat"); + Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat")); return Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "arrays/ok/")) .filter(Files::isRegularFile) .filter(f -> (f.toString().endsWith("litmus"))) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java index 2eb3c03b23..7d9462022a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java @@ -16,6 +16,7 @@ import org.junit.runners.Parameterized; import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; @@ -32,8 +33,8 @@ public class DartagnanBranchTest { public static Iterable data() throws IOException { ImmutableMap expected = readExpectedResults(); - Wmm linuxWmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat"); - Wmm aarch64Wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/aarch64.cat"); + Wmm linuxWmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat")); + Wmm aarch64Wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/aarch64.cat")); List data = Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "branch/C/")) .filter(Files::isRegularFile) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java index 7adf4f3978..fcea5c540e 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java @@ -25,6 +25,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -38,7 +39,7 @@ public class DartagnanUnrollWhileTest { @Parameterized.Parameters(name = "{index}: {0} bound={2}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat"); + Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat")); String test1 = ResourceHelper.TEST_RESOURCE_PATH + "unroll/C-unroll-01.litmus"; String test2 = ResourceHelper.TEST_RESOURCE_PATH + "unroll/C-unroll-02.litmus"; String test3 = ResourceHelper.TEST_RESOURCE_PATH + "unroll/C-unroll-03.litmus"; diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java index 72afd25b75..698ac15f91 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java @@ -16,6 +16,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.util.*; @@ -26,7 +27,7 @@ public class RelCritTest { @Parameterized.Parameters(name = "{index}: {0}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat"); + Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat")); String path = ResourceHelper.TEST_RESOURCE_PATH + "wmm/relation/basic/crit/"; List data = new ArrayList<>(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java index 930cbc30d1..23cb79af09 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java @@ -18,6 +18,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.util.*; @@ -28,7 +29,7 @@ public class ExclusivePairsTest { @Parameterized.Parameters(name = "{index}: {0}") public static Iterable data() throws IOException { - Wmm wmm = new ParserCat().parse(ResourceHelper.CAT_RESOURCE_PATH + "cat/aarch64.cat"); + Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/aarch64.cat")); String path = ResourceHelper.TEST_RESOURCE_PATH + "wmm/relation/basic/rmw/aarch64/"; List data = new ArrayList<>(); diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index 6d56ed19f3..7acf5f2f24 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -13,6 +13,7 @@ import com.dat3m.dartagnan.wmm.utils.Arch; import org.apache.commons.cli.*; +import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -78,8 +79,8 @@ public static void main(String[] args) throws IOException { System.exit(0); return; } - Wmm mcmS = new ParserCat().parse(cmd.getOptionValue("scat")); - Wmm mcmT = new ParserCat().parse(cmd.getOptionValue("tcat")); + Wmm mcmS = new ParserCat().parse(new File(cmd.getOptionValue("scat"))); + Wmm mcmT = new ParserCat().parse(new File(cmd.getOptionValue("tcat"))); if(cmd.hasOption("draw")) { mcmS.setDrawExecutionGraph(); diff --git a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java index 8c5dd47cc2..9951023e08 100644 --- a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java +++ b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java @@ -18,6 +18,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -33,10 +34,10 @@ public class PorthosTest { @Parameterized.Parameters(name = "{index}: {0} {2} -> {3} mode={7} unroll={6} alias=anderson") public static Iterable data() throws IOException { - Wmm wmmSc = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/sc.cat"); - Wmm wmmTso = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/tso.cat"); - Wmm wmmPpc = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/power.cat"); - Wmm wmmArm = new ParserCat().parse(CAT_RESOURCE_PATH + "cat/arm.cat"); + Wmm wmmSc = new ParserCat().parse(new File(CAT_RESOURCE_PATH + "cat/sc.cat")); + Wmm wmmTso = new ParserCat().parse(new File(CAT_RESOURCE_PATH + "cat/tso.cat")); + Wmm wmmPpc = new ParserCat().parse(new File(CAT_RESOURCE_PATH + "cat/power.cat")); + Wmm wmmArm = new ParserCat().parse(new File(CAT_RESOURCE_PATH + "cat/arm.cat")); return Arrays.asList(new Object[][] { { BENCHMARKS_RESOURCE_PATH + "benchmarks/Bakery.pts", false, Arch.NONE, Arch.TSO, wmmSc, wmmTso, 2, Mode.KNASTER}, diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index d829a84efd..7089e6ddfd 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -8,8 +8,6 @@ import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileNameExtensionFilter; -import org.antlr.v4.runtime.CharStreams; - import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -75,17 +73,13 @@ public String getLoadedFormat(){ return loadedFormat; } - public String getText(){ - return editorPane.getText(); - } - - public void load() throws IOException { + public void load() { if(code.equals(PROGRAM)) { - loaded = new ProgramParser().parse(CharStreams.fromString(getText()), loadedFormat); + loaded = new ProgramParser().parse(editorPane.getText(), loadedFormat); } else if(code.equals(SOURCE_MM)) { - loaded = new ParserCat().parse(CharStreams.fromString(getText())); + loaded = new ParserCat().parse(editorPane.getText()); } else if(code.equals(TARGET_MM)) { - loaded = new ParserCat().parse(CharStreams.fromString(getText())); + loaded = new ParserCat().parse(editorPane.getText()); } } From 767972281c3b7b4cdb062cff72c4921a08c18fde Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 5 Apr 2019 15:12:29 +0300 Subject: [PATCH 117/145] Parsers: part 2 --- .../java/com/dat3m/dartagnan/Dartagnan.java | 2 +- .../parsers/program/ProgramParser.java | 20 +++++++++---------- .../dartagnan/AbstractDartagnanTest.java | 8 ++++---- .../dat3m/dartagnan/DartagnanAARCH64Test.java | 4 ++-- .../dartagnan/DartagnanArrayIllegalTest.java | 9 +++++---- .../dartagnan/DartagnanArrayValidTest.java | 8 ++++---- .../dat3m/dartagnan/DartagnanBranchTest.java | 8 ++++---- .../dat3m/dartagnan/DartagnanLinuxTest.java | 4 ++-- .../com/dat3m/dartagnan/DartagnanPPCTest.java | 4 ++-- .../dartagnan/DartagnanUnrollWhileTest.java | 8 ++++---- .../com/dat3m/dartagnan/DartagnanX86Test.java | 4 ++-- .../program/utils/ProgramBuilderTest.java | 3 ++- .../wmm/relation/basic/RelCritTest.java | 8 ++++---- .../basic/rmw/ExclusivePairsTest.java | 10 +++++----- .../main/java/com/dat3m/porthos/Porthos.java | 4 ++-- .../java/com/dat3m/porthos/PorthosTest.java | 10 +++++----- 16 files changed, 58 insertions(+), 56 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index a33dd52a0c..91f79726d0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -68,7 +68,7 @@ public static void main(String[] args) throws IOException { Mode mode = Mode.get(cmd.getOptionValue("mode")); Alias alias = Alias.get(cmd.getOptionValue("alias")); - Program p = new ProgramParser().parse(inputFilePath); + Program p = new ProgramParser().parse(new File(inputFilePath)); Arch target = p.getArch(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index cf69c36777..8a2e0cd15a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -15,14 +15,13 @@ public class ProgramParser { private static final String TYPE_LITMUS_X86 = "X86"; private static final String TYPE_LITMUS_C = "C"; - public Program parse(String inputFilePath) throws IOException { - ParserInterface parser = getConcreteParser(inputFilePath); - File file = new File(inputFilePath); + public Program parse(File file) throws IOException { FileInputStream stream = new FileInputStream(file); + ParserInterface parser = getConcreteParser(file); CharStream charStream = CharStreams.fromStream(stream); Program program = parser.parse(charStream); stream.close(); - program.setName(inputFilePath); + program.setName(file.getName()); return program; } @@ -35,11 +34,13 @@ public Program parse(String raw, String format) { throw new ParsingException("Unknown input file type"); } - private ParserInterface getConcreteParser(String inputFilePath) throws IOException { - if(inputFilePath.endsWith("pts")){ + private ParserInterface getConcreteParser(File file) throws IOException { + String name = file.getName(); + String format = name.substring(name.lastIndexOf(".") + 1); + if(format.equals("pts")){ return new ParserPorthos(); - } else if(inputFilePath.endsWith("litmus")){ - return getConcreteLitmusParser(readFirstLine(inputFilePath).toUpperCase()); + } else if(format.equals("litmus")){ + return getConcreteLitmusParser(readFirstLine(file).toUpperCase()); } throw new ParsingException("Unknown input file type"); } @@ -57,8 +58,7 @@ private ParserInterface getConcreteLitmusParser(String programText){ throw new ParsingException("Unknown input file type"); } - private String readFirstLine(String inputFilePath) throws IOException{ - File file = new File(inputFilePath); + private String readFirstLine(File file) throws IOException{ FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); String line = bufferedReader.readLine(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java index 246048669e..48ea3c7a6d 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/AbstractDartagnanTest.java @@ -44,15 +44,15 @@ static Iterable buildParameters(String litmusPath, String cat, Arch ta }, ArrayList::addAll); } - private String input; + private String path; private boolean expected; private Arch target; private Wmm wmm; private int unroll; private Mode mode; - AbstractDartagnanTest(String input, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { - this.input = input; + AbstractDartagnanTest(String path, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { + this.path = path; this.expected = expected; this.target = target; this.wmm = wmm; @@ -63,7 +63,7 @@ static Iterable buildParameters(String litmusPath, String cat, Arch ta @Test public void test() { try { - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); if (program.getAss() != null) { Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanAARCH64Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanAARCH64Test.java index 3126243796..d1c3009e40 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanAARCH64Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanAARCH64Test.java @@ -16,7 +16,7 @@ public static Iterable data() throws IOException { return buildParameters("litmus/AARCH64/", "cat/aarch64.cat", Arch.ARM8, 2); } - public DartagnanAARCH64Test(String input, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { - super(input, expected, target, wmm, unroll, mode); + public DartagnanAARCH64Test(String path, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { + super(path, expected, target, wmm, unroll, mode); } } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java index d18fa70445..45a265e5e1 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayIllegalTest.java @@ -8,6 +8,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -27,16 +28,16 @@ public static Iterable data() throws IOException { .collect(Collectors.toList()); } - private String input; + private String path; - public DartagnanArrayIllegalTest(String input) { - this.input = input; + public DartagnanArrayIllegalTest(String path) { + this.path = path; } @Test public void test() { try{ - new ProgramParser().parse(input); + new ProgramParser().parse(new File(path)); fail("Didn't throw an exception"); } catch(ParseCancellationException | ParsingException e){ // Test succeeded diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java index d0e474223a..94924b40ae 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanArrayValidTest.java @@ -36,18 +36,18 @@ public static Iterable data() throws IOException { .collect(Collectors.toList()); } - private String input; + private String path; private Wmm wmm; - public DartagnanArrayValidTest(String input, Wmm wmm) { - this.input = input; + public DartagnanArrayValidTest(String path, Wmm wmm) { + this.path = path; this.wmm = wmm; } @Test public void test() { try{ - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertTrue(Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 2, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java index 7d9462022a..16fcbb5061 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanBranchTest.java @@ -65,12 +65,12 @@ private static ImmutableMap readExpectedResults() throws IOExce return builder.build(); } - private String input; + private String path; private Wmm wmm; private boolean expected; - public DartagnanBranchTest(String input, boolean expected, Wmm wmm) { - this.input = input; + public DartagnanBranchTest(String path, boolean expected, Wmm wmm) { + this.path = path; this.expected = expected; this.wmm = wmm; } @@ -78,7 +78,7 @@ public DartagnanBranchTest(String input, boolean expected, Wmm wmm) { @Test public void test() { try{ - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); assertEquals(expected, Dartagnan.testProgram(solver, ctx, program, wmm, Arch.NONE, 1, Mode.KNASTER, Alias.CFIS)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanLinuxTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanLinuxTest.java index bbd4a15eba..18cebc757a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanLinuxTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanLinuxTest.java @@ -16,7 +16,7 @@ public static Iterable data() throws IOException { return buildParameters("litmus/C/", "cat/linux-kernel.cat", Arch.NONE, 2); } - public DartagnanLinuxTest(String input, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { - super(input, expected, target, wmm, unroll, mode); + public DartagnanLinuxTest(String path, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { + super(path, expected, target, wmm, unroll, mode); } } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanPPCTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanPPCTest.java index 0a0d5a9961..1bc244deb3 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanPPCTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanPPCTest.java @@ -16,7 +16,7 @@ public static Iterable data() throws IOException { return buildParameters("litmus/PPC/", "cat/power.cat", Arch.POWER, 2); } - public DartagnanPPCTest(String input, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { - super(input, expected, target, wmm, unroll, mode); + public DartagnanPPCTest(String path, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { + super(path, expected, target, wmm, unroll, mode); } } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java index fcea5c540e..6755eeef4e 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanUnrollWhileTest.java @@ -66,14 +66,14 @@ public static Iterable data() throws IOException { } - private String input; + private String path; private Wmm wmm; private int bound; private String[] names; private int[] values; - public DartagnanUnrollWhileTest(String input, Wmm wmm, int bound, String[] names, int[] values) { - this.input = input; + public DartagnanUnrollWhileTest(String path, Wmm wmm, int bound, String[] names, int[] values) { + this.path = path; this.wmm = wmm; this.bound = bound; this.names = names; @@ -83,7 +83,7 @@ public DartagnanUnrollWhileTest(String input, Wmm wmm, int bound, String[] names @Test public void test() { try { - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); program.setAss(mkAssert(program, names, values)); Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanX86Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanX86Test.java index 92356e9ba0..a6071fef00 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanX86Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/DartagnanX86Test.java @@ -16,7 +16,7 @@ public static Iterable data() throws IOException { return buildParameters("litmus/X86/", "cat/tso.cat", Arch.TSO, 2); } - public DartagnanX86Test(String input, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { - super(input, expected, target, wmm, unroll, mode); + public DartagnanX86Test(String path, boolean expected, Arch target, Wmm wmm, int unroll, Mode mode) { + super(path, expected, target, wmm, unroll, mode); } } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java index 26a694a968..d6ac26a53c 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilderTest.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.utils.ResourceHelper; import org.junit.Test; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -19,7 +20,7 @@ public void testLabelsValidation() throws IOException { .filter(f -> (f.toString().endsWith("litmus"))) .forEach(f -> { try{ - new ProgramParser().parse(f.toString()); + new ProgramParser().parse(new File(f.toString())); } catch(ParsingException e){ // Test succeeded } catch (IOException e){ diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java index 698ac15f91..b1de6d9087 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/RelCritTest.java @@ -43,12 +43,12 @@ public static Iterable data() throws IOException { return data; } - private String input; + private String path; private Wmm wmm; private int[] expectedEdges; - public RelCritTest(String input, Wmm wmm, int[] expectedEdges) { - this.input = input; + public RelCritTest(String path, Wmm wmm, int[] expectedEdges) { + this.path = path; this.wmm = wmm; this.expectedEdges = expectedEdges; } @@ -58,7 +58,7 @@ public void test() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); // Force encoding all possible "crit" relations wmm.setDrawExecutionGraph(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java index 23cb79af09..c701c940fa 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/wmm/relation/basic/rmw/ExclusivePairsTest.java @@ -51,14 +51,14 @@ public static Iterable data() throws IOException { return data; } - private String input; + private String path; private Wmm wmm; private boolean expectedState; private boolean expectedFlag; private int[] expectedEdges; - public ExclusivePairsTest(String input, Wmm wmm, boolean expectedState, boolean expectedFlag, int[] expectedEdges) { - this.input = input; + public ExclusivePairsTest(String path, Wmm wmm, boolean expectedState, boolean expectedFlag, int[] expectedEdges) { + this.path = path; this.wmm = wmm; this.expectedState = expectedState; this.expectedFlag = expectedFlag; @@ -70,7 +70,7 @@ public void testReachableStates() { try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); // Test final state assertEquals(expectedState, Dartagnan.testProgram(solver, ctx, program, wmm, program.getArch(), 1, Mode.KNASTER, Alias.CFIS)); @@ -99,7 +99,7 @@ public void testUnpredictableBehaviourFlag(){ try{ Context ctx = new Context(); Solver solver = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); - Program program = new ProgramParser().parse(input); + Program program = new ProgramParser().parse(new File(path)); // Add program without assertions program.unroll(1, 0); diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index 7acf5f2f24..f5365a5ab3 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -102,8 +102,8 @@ public static void main(String[] args) throws IOException { Alias alias = Alias.get(cmd.getOptionValue("alias")); ProgramParser programParser = new ProgramParser(); - Program pSource = programParser.parse(inputFilePath); - Program pTarget = programParser.parse(inputFilePath); + Program pSource = programParser.parse(new File(inputFilePath)); + Program pTarget = programParser.parse(new File(inputFilePath)); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); diff --git a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java index 9951023e08..0fa88c9a7b 100644 --- a/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java +++ b/porthos/src/test/java/com/dat3m/porthos/PorthosTest.java @@ -114,7 +114,7 @@ public static Iterable data() throws IOException { }); } - private String input; + private String programFilePath; private boolean expected; private Arch source; private Arch target; @@ -123,8 +123,8 @@ public static Iterable data() throws IOException { private int steps; private Mode mode; - public PorthosTest(String input, boolean expected, Arch source, Arch target, Wmm sourceWmm, Wmm targetWmm, int steps, Mode mode) { - this.input = input; + public PorthosTest(String path, boolean expected, Arch source, Arch target, Wmm sourceWmm, Wmm targetWmm, int steps, Mode mode) { + this.programFilePath = path; this.expected = expected; this.source = source; this.target = target; @@ -138,8 +138,8 @@ public PorthosTest(String input, boolean expected, Arch source, Arch target, Wmm public void test() { try { ProgramParser programParser = new ProgramParser(); - Program pSource = programParser.parse(input); - Program pTarget = programParser.parse(input); + Program pSource = programParser.parse(new File(programFilePath)); + Program pTarget = programParser.parse(new File(programFilePath)); Context ctx = new Context(); Solver s1 = ctx.mkSolver(ctx.mkTactic(Dartagnan.TACTIC)); From 42888a5b092970a89e84612e473f0049bfd608d9 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 5 Apr 2019 15:22:47 +0300 Subject: [PATCH 118/145] Parsers: part 3 (concrete program parsers made package-private) --- .../com/dat3m/dartagnan/parsers/program/ParserInterface.java | 2 +- .../dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java | 2 +- .../java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java | 2 +- .../com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java | 2 +- .../com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java | 2 +- .../java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java index 40a91ee631..53937e8c21 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserInterface.java @@ -3,7 +3,7 @@ import com.dat3m.dartagnan.program.Program; import org.antlr.v4.runtime.CharStream; -public interface ParserInterface { +interface ParserInterface { Program parse(CharStream charStream); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java index 01a5364744..6e35412d74 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusAArch64.java @@ -10,7 +10,7 @@ import org.antlr.v4.runtime.*; -public class ParserLitmusAArch64 implements ParserInterface { +class ParserLitmusAArch64 implements ParserInterface { @Override public Program parse(CharStream charStream) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 5a1e8a48ec..28b505385b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -9,7 +9,7 @@ import org.antlr.v4.runtime.*; -public class ParserLitmusC implements ParserInterface { +class ParserLitmusC implements ParserInterface { @Override public Program parse(CharStream charStream) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java index a52572417c..b1a329d24f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusPPC.java @@ -10,7 +10,7 @@ import org.antlr.v4.runtime.*; -public class ParserLitmusPPC implements ParserInterface { +class ParserLitmusPPC implements ParserInterface { @Override public Program parse(CharStream charStream) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java index 32e27b9d8a..c56e178b96 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusX86.java @@ -10,7 +10,7 @@ import org.antlr.v4.runtime.*; -public class ParserLitmusX86 implements ParserInterface { +class ParserLitmusX86 implements ParserInterface { @Override public Program parse(CharStream charStream) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java index 9998e6feae..f3291799b3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserPorthos.java @@ -8,7 +8,7 @@ import com.dat3m.dartagnan.program.Program; import org.antlr.v4.runtime.*; -public class ParserPorthos implements ParserInterface{ +class ParserPorthos implements ParserInterface{ @Override public Program parse(CharStream charStream) { From 878a4c613ba1c3f6b408014dd6677949990e0e35 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 5 Apr 2019 15:57:14 +0300 Subject: [PATCH 119/145] UI: Draw graph only when it is allowed (SAT forall cannot have a graph) --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 2 +- .../java/com/dat3m/ui/graph/GraphOption.java | 25 ++++++++++--------- .../java/com/dat3m/ui/result/Dat3mResult.java | 2 -- .../dat3m/ui/result/PortabilityResult.java | 15 ----------- .../dat3m/ui/result/ReachabilityResult.java | 11 -------- 5 files changed, 14 insertions(+), 41 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 304d9bbc0e..49d1e2b1fc 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -142,7 +142,7 @@ private void runTest(){ } showError(msg, "Program error"); } - if(testResult != null && testResult.isSat()) { + if(testResult != null && testResult.getGraph() != null) { graph.generate(testResult); } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 0b9bed404d..533e8d09f9 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -55,27 +55,28 @@ public RelSelector getSelector(){ return selector; } - public void generate(Dat3mResult res) { - try { - if(res.isSat()) { - List files = Arrays.asList(dotFile, pngFile); - // Create the file and parent directory if they do not exist - for(File f : files) { + public void generate(Dat3mResult result) { + Graph graph = result.getGraph(); + if(graph != null) { + try { + List files = Arrays.asList(dotFile, pngFile); + // Create the file and parent directory if they do not exist + for(File f : files) { if (f.getParentFile() != null) { f.getParentFile().mkdirs(); - } - f.createNewFile(); - } - Graph graph = res.getGraph(); + } + f.createNewFile(); + } File dot2File = graph.draw(dotFile.getAbsolutePath()); // The previous png file needs to be deleted pngFile.delete(); InputStream targetStream = new FileInputStream(dot2File); MutableGraph g = Parser.read(targetStream); fromGraph(g).render(PNG).toFile(pngFile); + + } catch (IOException e) { + // This should never happen since the file is always created } - } catch (IOException e) { - // This should never happen since the file is always created } } diff --git a/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java index 5bade22b6d..6054287c59 100644 --- a/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/Dat3mResult.java @@ -7,6 +7,4 @@ public interface Dat3mResult { String getVerdict(); Graph getGraph(); - - boolean isSat(); } diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index f433f3351e..aa92916855 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -17,7 +17,6 @@ public class PortabilityResult implements Dat3mResult { private final Wmm sourceWmm; private final Wmm targetWmm; private final Options options; - private boolean isSat = false; private GraphOption gOptions; private Graph graph; @@ -32,14 +31,6 @@ public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourc this.gOptions = gOptions; run(); } - - public Program getSourceProgram() { - return sourceProgram; - } - - public Program getTargetProgram() { - return targetProgram; - } public Graph getGraph(){ return graph; @@ -64,13 +55,7 @@ private void run(){ graph = new Graph(s1.getModel(), ctx); graph.addRelations(gOptions.getSelector().getSelection()); graph.build(sourceProgram, targetProgram); - isSat = true; } ctx.close(); } - - @Override - public boolean isSat() { - return isSat; - } } diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index f39bd88560..b9a37c90a6 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -15,7 +15,6 @@ public class ReachabilityResult implements Dat3mResult { private final Program program; private final Wmm wmm; private final Options options; - private boolean isSat = false; private GraphOption gOptions; private Graph graph; @@ -28,10 +27,6 @@ public ReachabilityResult(Program program, Wmm wmm, Options options, GraphOption this.options = options; run(); } - - public Program getProgram() { - return program; - } public Graph getGraph(){ return graph; @@ -54,7 +49,6 @@ private void run(){ graph = new Graph(solver.getModel(), ctx); graph.addRelations(gOptions.getSelector().getSelection()); graph.build(program); - isSat = true; } ctx.close(); } @@ -68,9 +62,4 @@ private void buildVerdict(boolean result){ sb.append(result ? "OK" : "No").append("\n"); verdict = sb.toString(); } - - @Override - public boolean isSat() { - return isSat; - } } From c615df8dc9aa3b518bcb27d6440b46298c5269b7 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Fri, 5 Apr 2019 16:41:18 +0300 Subject: [PATCH 120/145] UI: minor refactoring --- .../java/com/dat3m/ui/editor/EditorsPane.java | 10 +++---- .../main/java/com/dat3m/ui/icon/IconCode.java | 6 +++- .../com/dat3m/ui/options/OptionsPane.java | 3 +- .../main/java/com/dat3m/ui/utils/Utils.java | 29 ------------------- 4 files changed, 10 insertions(+), 38 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index 26f5a88a82..97765c3ffa 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -7,10 +7,7 @@ import javax.swing.*; import javax.swing.border.TitledBorder; -import static com.dat3m.ui.utils.Utils.getMainScreenHeight; -import static com.dat3m.ui.utils.Utils.getMainScreenWidth; - -import java.awt.Dimension; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -30,8 +27,9 @@ public EditorsPane(){ menu = new JMenu("Import"); menu.add(editors.get(EditorCode.PROGRAM).getMenuItem()); menu.add(editors.get(EditorCode.TARGET_MM).getMenuItem()); - - Dimension editorsDimension = new Dimension(2 * getMainScreenWidth() / 5, getMainScreenHeight()); + + Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension editorsDimension = new Dimension((int)(2 * screenDimension.getWidth() / 5), (int)screenDimension.getHeight()); editors.get(EditorCode.PROGRAM).setPreferredSize(editorsDimension); editors.get(EditorCode.TARGET_MM).setPreferredSize(editorsDimension); diff --git a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java index 2fc17d4943..efb96cd007 100644 --- a/ui/src/main/java/com/dat3m/ui/icon/IconCode.java +++ b/ui/src/main/java/com/dat3m/ui/icon/IconCode.java @@ -1,6 +1,6 @@ package com.dat3m.ui.icon; -import static com.dat3m.ui.utils.Utils.getResource; +import com.dat3m.ui.Dat3M; import java.net.URL; @@ -32,4 +32,8 @@ public URL getPath(){ } throw new RuntimeException("Illegal IconCode option"); } + + private URL getResource(String filename){ + return Dat3M.class.getResource(filename); + } } diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 24f69e2ce0..7bf7af7bea 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -21,7 +21,6 @@ import java.util.EnumSet; import java.util.Iterator; -import static com.dat3m.ui.utils.Utils.getMainScreenHeight; import static java.lang.Math.min; import static java.lang.Math.round; import static javax.swing.BorderFactory.createTitledBorder; @@ -137,7 +136,7 @@ public Options getOptions(){ } private int getIconHeight(){ - return min(500, (int) round((getMainScreenHeight() / 2))); + return min(500, (int) round((Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2))); } private void mkGrid(){ diff --git a/ui/src/main/java/com/dat3m/ui/utils/Utils.java b/ui/src/main/java/com/dat3m/ui/utils/Utils.java index 7c342c3b07..61e8fc862e 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Utils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/Utils.java @@ -1,36 +1,11 @@ package com.dat3m.ui.utils; -import static java.lang.Math.round; - -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.net.URL; - import javax.swing.JOptionPane; -import com.dat3m.ui.Dat3M; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; public class Utils { - - public static int getMainScreenWidth() { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice[] gs = ge.getScreenDevices(); - if (gs.length > 0) { - return round(gs[0].getDisplayMode().getWidth()); - } - return 0; - } - - public static int getMainScreenHeight() { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice[] gs = ge.getScreenDevices(); - if (gs.length > 0) { - return round(gs[0].getDisplayMode().getHeight()); - } - return 0; - } public static void showError(String msg, String title){ JOptionPane.showMessageDialog( @@ -44,8 +19,4 @@ public static void showError(String msg, String title){ public static void showError(String msg){ showError(msg, "Error"); } - - public static URL getResource(String filename){ - return Dat3M.class.getResource(filename); - } } From 9a79304405e79cbf058e5306c5f65d3a20d86386 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Fri, 5 Apr 2019 17:13:22 +0200 Subject: [PATCH 121/145] Graph Improvement - Part 1 --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 11 +++--- .../java/com/dat3m/ui/button/GraphButton.java | 22 +++++++++--- .../java/com/dat3m/ui/button/RelsButton.java | 36 +++++++++++++++++++ .../java/com/dat3m/ui/graph/RelSelector.java | 2 +- .../com/dat3m/ui/options/OptionsPane.java | 21 ++++++++--- .../dat3m/ui/options/utils/ControlCode.java | 6 +++- 6 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 ui/src/main/java/com/dat3m/ui/button/RelsButton.java diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 304d9bbc0e..07f4f5ab2e 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -64,6 +64,7 @@ private Dat3M() { optionsPane.getTestButton().addActionListener(this); optionsPane.getClearButton().addActionListener(this); optionsPane.getGraphButton().addActionListener(this); + optionsPane.getRelsButton().addActionListener(this); // optionsPane needs to listen to editor to clean the console editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane); @@ -71,7 +72,7 @@ private Dat3M() { editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); // The console shall be cleaned every time the program or MM is modified from the editor - EditorListener listener = new EditorListener(optionsPane.getConsolePane(), optionsPane.getGraphButton()); + EditorListener listener = new EditorListener(optionsPane.getConsolePane(), optionsPane.getClearButton()); editorsPane.getEditor(EditorCode.PROGRAM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().addKeyListener(listener); @@ -93,10 +94,12 @@ public void actionPerformed(ActionEvent event) { runTest(); if(testResult != null){ optionsPane.getConsolePane().setText(testResult.getVerdict()); - optionsPane.getGraphButton().setEnabled(testResult.getGraph() != null); + if(optionsPane.getGraphButton().isSelected()) { + EventQueue.invokeLater(graph::open); + } } - } else if(ControlCode.GRAPH.actionCommand().equals(command)){ - EventQueue.invokeLater(graph::open); + } else if(ControlCode.RELS.actionCommand().equals(command)){ + graph.getSelector().open(); } } diff --git a/ui/src/main/java/com/dat3m/ui/button/GraphButton.java b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java index a9fe5e233b..0b5e3e2395 100644 --- a/ui/src/main/java/com/dat3m/ui/button/GraphButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java @@ -1,19 +1,31 @@ package com.dat3m.ui.button; +import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; -import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JRadioButton; +import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.ui.options.utils.ControlCode; -public class GraphButton extends JButton { +public class GraphButton extends JRadioButton implements ActionListener { public GraphButton() { - super("Execution Witness"); + super("Draw Graph"); setActionCommand(ControlCode.GRAPH.actionCommand()); - setEnabled(false); - setMaximumSize(new Dimension(OPTWIDTH, 50)); + setMaximumSize(new Dimension(OPTWIDTH/2, 50)); + } + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + if(e.getActionCommand().equals(ControlCode.MODE.actionCommand())){ + setEnabled(!(((JComboBox)e.getSource()).getSelectedItem()).equals(KNASTER)); + } } } diff --git a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java new file mode 100644 index 0000000000..c3646159ef --- /dev/null +++ b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java @@ -0,0 +1,36 @@ +package com.dat3m.ui.button; + +import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +import com.dat3m.ui.options.utils.ControlCode; + +public class RelsButton extends JButton implements ActionListener { + + private boolean drawGraphSelected = false; + //private boolean mmParsed = false; + + public RelsButton() { + super("Relation Selector"); + setActionCommand(ControlCode.RELS.actionCommand()); + setEnabled(false); + setMaximumSize(new Dimension(OPTWIDTH/2, 50)); + } + + public void refreshButton() { + setEnabled(drawGraphSelected); + } + + @Override + public void actionPerformed(ActionEvent e) { + if(e.getActionCommand().equals(ControlCode.GRAPH.actionCommand())){ + drawGraphSelected = ((GraphButton)e.getSource()).isSelected(); + refreshButton(); + } + } +} diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index 190e3ee251..31b4e1aafa 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -51,7 +51,7 @@ public void open() { setVisible(true); } - public int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { + private int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { if(mm != null) { Set rels = mm.getRelationRepository().getRelations().stream() .filter(ev -> !ev.getName().equals(ev.getTerm())) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 24f69e2ce0..3655564479 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.ui.button.ClearButton; import com.dat3m.ui.button.GraphButton; +import com.dat3m.ui.button.RelsButton; import com.dat3m.ui.button.TestButton; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.options.utils.ArchManager; @@ -45,7 +46,8 @@ public class OptionsPane extends JPanel implements ActionListener { private final JButton testButton; private final JButton clearButton; - private final JButton graphButton; + private final GraphButton graphButton; + private final RelsButton relsButton; private final JTextPane consolePane; @@ -69,6 +71,7 @@ public OptionsPane(){ testButton = new TestButton(); clearButton = new ClearButton(); graphButton = new GraphButton(); + relsButton = new RelsButton(); consolePane = new JTextPane(); consolePane.setEditable(false); @@ -87,6 +90,8 @@ private void bindListeners(){ sourcePane.addActionListener(this); boundField.addActionListener(this); clearButton.addActionListener(this); + graphButton.addActionListener(relsButton); + modePane.addActionListener(graphButton); } public Selector getTaskPane(){ @@ -117,10 +122,14 @@ public JButton getClearButton(){ return clearButton; } - public JButton getGraphButton(){ + public GraphButton getGraphButton(){ return graphButton; } + public RelsButton getRelsButton(){ + return relsButton; + } + public JTextPane getConsolePane(){ return consolePane; } @@ -158,7 +167,10 @@ private void mkGrid(){ // Inner borders Border emptyBorder = BorderFactory.createEmptyBorder(); - JComponent[] panes = { taskPane, archPane, modePane, aliasPane, boundPane, testButton, clearButton, graphButton, scrollConsole }; + JSplitPane graphPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + graphPane.setLeftComponent(graphButton); + graphPane.setRightComponent(relsButton); + JComponent[] panes = { taskPane, archPane, modePane, aliasPane, boundPane, testButton, clearButton, graphPane, scrollConsole }; Iterator it = Arrays.asList(panes).iterator(); JComponent current = iconPane; current.setBorder(emptyBorder); @@ -181,8 +193,7 @@ private void mkGrid(){ @Override public void actionPerformed(ActionEvent e) { - // Any change in the (relevant) options clears the console and disable graph button + // Any change in the (relevant) options clears the console getConsolePane().setText(""); - graphButton.setEnabled(false); } } diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java index b1594c29b1..f7b10e17ea 100644 --- a/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java @@ -2,7 +2,7 @@ public enum ControlCode { - TASK, SOURCE, TARGET, MODE, ALIAS, BOUND, TEST, CLEAR, GRAPH; + TASK, SOURCE, TARGET, MODE, ALIAS, BOUND, TEST, CLEAR, GRAPH, RELS; @Override public String toString(){ @@ -25,6 +25,8 @@ public String toString(){ return "Clear"; case GRAPH: return "Graph"; + case RELS: + return "Select Relations"; } return super.toString(); } @@ -49,6 +51,8 @@ public String actionCommand(){ return "control_command_clear"; case GRAPH: return "control_command_graph"; + case RELS: + return "control_command_rels"; } throw new RuntimeException("Illegal EditorCode"); } From 7e00c20e292718a54445c99145f3a348d27d4bff Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Mon, 8 Apr 2019 11:29:33 +0300 Subject: [PATCH 122/145] Refactoring Memory Order --- .../program/arch/linux/event/RMWAbstract.java | 10 +--------- .../program/arch/linux/event/RMWCmpXchg.java | 2 +- .../program/arch/linux/event/RMWFetchOp.java | 2 +- .../program/arch/linux/event/RMWOpReturn.java | 2 +- .../program/arch/linux/event/RMWXchg.java | 2 +- .../dartagnan/program/arch/pts/event/Read.java | 8 ++++---- .../dartagnan/program/arch/pts/event/Write.java | 17 ++++++----------- .../dartagnan/program/arch/tso/event/Xchg.java | 2 +- .../com/dat3m/dartagnan/program/event/Init.java | 2 +- .../com/dat3m/dartagnan/program/event/Load.java | 10 +--------- .../dat3m/dartagnan/program/event/MemEvent.java | 8 +++++++- .../dat3m/dartagnan/program/event/Store.java | 10 +--------- 12 files changed, 26 insertions(+), 49 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWAbstract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWAbstract.java index b796b5f487..5c732022a0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWAbstract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWAbstract.java @@ -15,14 +15,12 @@ public abstract class RMWAbstract extends MemEvent implements RegWriter, RegRead protected final Register resultRegister; protected final ExprInterface value; - protected final String mo; protected ImmutableSet dataRegs; RMWAbstract(IExpr address, Register register, ExprInterface value, String mo) { - super(address); + super(address, mo); this.resultRegister = register; this.value = value; - this.mo = mo; this.dataRegs = value.getRegs(); addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.READ, EType.WRITE, EType.RMW, EType.REG_WRITER, EType.REG_READER); @@ -32,15 +30,9 @@ public abstract class RMWAbstract extends MemEvent implements RegWriter, RegRead super(other); this.resultRegister = other.resultRegister; this.value = other.value; - this.mo = other.mo; this.dataRegs = other.dataRegs; } - @Override - public boolean is(String param){ - return super.is(param) || (mo != null && mo.equals(param)); - } - @Override public Register getResultRegister() { return resultRegister; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWCmpXchg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWCmpXchg.java index 481e83614a..5e201d4872 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWCmpXchg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWCmpXchg.java @@ -64,7 +64,7 @@ public int compile(Arch target, int nextId, Event predecessor) { if (dummy != resultRegister) { events.addLast(new Local(resultRegister, dummy)); } - if (mo.equals(Mo.MB)) { + if (Mo.MB.equals(mo)) { events.addFirst(new FenceCond(load, "Mb")); events.addLast(new FenceCond(load, "Mb")); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWFetchOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWFetchOp.java index 662847ea41..a0f7e0fcdf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWFetchOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWFetchOp.java @@ -64,7 +64,7 @@ public int compile(Arch target, int nextId, Event predecessor) { if (dummy != resultRegister) { events.addLast(new Local(resultRegister, dummy)); } - if (mo.equals(Mo.MB)) { + if (Mo.MB.equals(mo)) { events.addFirst(new Fence("Mb")); events.addLast(new Fence("Mb")); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWOpReturn.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWOpReturn.java index 26b0b16619..e274bead98 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWOpReturn.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWOpReturn.java @@ -58,7 +58,7 @@ public int compile(Arch target, int nextId, Event predecessor) { RMWStore store = new RMWStore(load, address, resultRegister, Mo.storeMO(mo)); LinkedList events = new LinkedList<>(Arrays.asList(load, local, store)); - if (mo.equals(Mo.MB)) { + if (Mo.MB.equals(mo)) { events.addFirst(new Fence("Mb")); events.addLast(new Fence("Mb")); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWXchg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWXchg.java index 630f821650..66e34338a9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWXchg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/linux/event/RMWXchg.java @@ -58,7 +58,7 @@ public int compile(Arch target, int nextId, Event predecessor) { if (dummy != resultRegister) { events.addLast(new Local(resultRegister, dummy)); } - if (mo.equals(Mo.MB)) { + if (Mo.MB.equals(mo)) { events.addFirst(new Fence("Mb")); events.addLast(new Fence("Mb")); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Read.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Read.java index bc7d9b6715..f07688ac72 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Read.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Read.java @@ -19,7 +19,7 @@ public class Read extends MemEvent implements RegWriter { private final String mo; public Read(Register register, IExpr address, String mo) { - super(address); + super(address, mo); this.resultRegister = register; this.mo = mo; addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.READ, EType.REG_WRITER); @@ -63,15 +63,15 @@ public int compile(Arch target, int nextId, Event predecessor) { case NONE: case TSO: break; case POWER: - if(mo.equals(Mo.SC) || mo.equals(Mo.ACQUIRE) || mo.equals(Mo.CONSUME)){ + if(Mo.SC.equals(mo) || Mo.ACQUIRE.equals(mo) || Mo.CONSUME.equals(mo)){ events.addLast(new Fence("Lwsync")); - if(mo.equals(Mo.SC)){ + if(Mo.SC.equals(mo)){ events.addFirst(new Fence("Sync")); } } break; case ARM: case ARM8: - if(mo.equals(Mo.SC) || mo.equals(Mo.ACQUIRE) || mo.equals(Mo.CONSUME)) { + if(Mo.SC.equals(mo) || Mo.ACQUIRE.equals(mo) || Mo.CONSUME.equals(mo)) { events.addLast(new Fence("Ish")); } break; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Write.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Write.java index adbcbfc20a..fc4cf7bdd6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Write.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/pts/event/Write.java @@ -22,7 +22,7 @@ public class Write extends MemEvent implements RegReaderData { private final ImmutableSet dataRegs; public Write(IExpr address, ExprInterface value, String mo){ - super(address); + super(address, mo); this.value = value; this.mo = mo; this.dataRegs = value.getRegs(); @@ -36,11 +36,6 @@ private Write(Write other){ this.dataRegs = other.dataRegs; } - @Override - public boolean is(String param){ - return super.is(param) || (mo != null && mo.equals(param)); - } - @Override public ImmutableSet getDataRegs(){ return dataRegs; @@ -73,21 +68,21 @@ public int compile(Arch target, int nextId, Event predecessor) { case NONE: break; case TSO: - if(mo.equals(Mo.SC)){ + if(Mo.SC.equals(mo)){ events.addLast(new Fence("Mfence")); } break; case POWER: - if(mo.equals(Mo.RELEASE)){ + if(Mo.RELEASE.equals(mo)){ events.addFirst(new Fence("Lwsync")); - } else if(mo.equals(Mo.SC)){ + } else if(Mo.SC.equals(mo)){ events.addFirst(new Fence("Sync")); } break; case ARM: case ARM8: - if(mo.equals(Mo.RELEASE) || mo.equals(Mo.SC)){ + if(Mo.RELEASE.equals(mo) || Mo.SC.equals(mo)){ events.addFirst(new Fence("Ish")); - if(mo.equals(Mo.SC)){ + if(Mo.SC.equals(mo)){ events.addLast(new Fence("Ish")); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/tso/event/Xchg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/tso/event/Xchg.java index 5eeb4b557e..ad16d81c7d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/tso/event/Xchg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/arch/tso/event/Xchg.java @@ -22,7 +22,7 @@ public class Xchg extends MemEvent implements RegWriter, RegReaderData { private final ImmutableSet dataRegs; public Xchg(Address address, Register register) { - super(address); + super(address, null); this.resultRegister = register; this.dataRegs = ImmutableSet.of(resultRegister); addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.READ, EType.WRITE, EType.ATOM, EType.REG_WRITER, EType.REG_READER); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Init.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Init.java index 8f027b7c0d..3ec9bf6911 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Init.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Init.java @@ -10,7 +10,7 @@ public class Init extends MemEvent { private final IConst value; public Init(Address address, IConst value) { - super(address); + super(address, null); this.value = value; addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.WRITE, EType.INIT); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Load.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Load.java index 0d21ac3ba5..14ebeaf1b6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Load.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Load.java @@ -11,26 +11,18 @@ public class Load extends MemEvent implements RegWriter { protected final Register resultRegister; - protected final String mo; public Load(Register register, IExpr address, String mo) { - super(address); - this.mo = mo; + super(address, mo); this.resultRegister = register; addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.READ, EType.REG_WRITER); } protected Load(Load other){ super(other); - this.mo = other.mo; this.resultRegister = other.resultRegister; } - @Override - public boolean is(String param){ - return super.is(param) || (mo != null && mo.equals(param)); - } - @Override public void initialise(Context ctx) { memValueExpr = resultRegister.toZ3IntResult(this, ctx); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/MemEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/MemEvent.java index 4fe8b0f19c..a7eaf9c325 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/MemEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/MemEvent.java @@ -10,13 +10,18 @@ public abstract class MemEvent extends Event { protected final IExpr address; + protected final String mo; protected IntExpr memAddressExpr; protected IntExpr memValueExpr; private ImmutableSet
maxAddressSet; - public MemEvent(IExpr address){ + public MemEvent(IExpr address, String mo){ this.address = address; + this.mo = mo; + if(mo != null){ + addFilters(mo); + } } protected MemEvent(MemEvent other){ @@ -25,6 +30,7 @@ protected MemEvent(MemEvent other){ this.maxAddressSet = other.maxAddressSet; this.memAddressExpr = other.memAddressExpr; this.memValueExpr = other.memValueExpr; + this.mo = other.mo; } public IntExpr getMemAddressExpr(){ diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Store.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Store.java index cb76f2bec5..6dfd48ef69 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Store.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/Store.java @@ -11,12 +11,10 @@ public class Store extends MemEvent implements RegReaderData { protected final ExprInterface value; - protected final String mo; private final ImmutableSet dataRegs; public Store(IExpr address, ExprInterface value, String mo){ - super(address); - this.mo = mo; + super(address, mo); this.value = value; dataRegs = value.getRegs(); addFilters(EType.ANY, EType.VISIBLE, EType.MEMORY, EType.WRITE, EType.REG_READER); @@ -24,16 +22,10 @@ public Store(IExpr address, ExprInterface value, String mo){ protected Store(Store other){ super(other); - this.mo = other.mo; this.value = other.value; dataRegs = other.dataRegs; } - @Override - public boolean is(String param){ - return super.is(param) || (mo != null && mo.equals(param)); - } - @Override public void initialise(Context ctx) { memValueExpr = value.toZ3Int(this, ctx); From 2dec599beb9fe06095759c2121c9e7a775915cb3 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Mon, 8 Apr 2019 15:54:57 +0200 Subject: [PATCH 123/145] Graph menu removed - sorted relations --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 14 +++++- .../java/com/dat3m/ui/button/RelsButton.java | 10 +--- .../java/com/dat3m/ui/graph/GraphOption.java | 42 +--------------- .../java/com/dat3m/ui/graph/RelSelector.java | 49 +++++++++++-------- 4 files changed, 44 insertions(+), 71 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 07f4f5ab2e..0bf8dbef02 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -24,6 +24,9 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; + +import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; +import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static com.dat3m.ui.utils.Utils.showError; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.UIManager.getDefaults; @@ -32,7 +35,7 @@ public class Dat3M extends JFrame implements ActionListener { private final OptionsPane optionsPane = new OptionsPane(); private final EditorsPane editorsPane = new EditorsPane(); - private final GraphOption graph = new GraphOption(editorsPane); + private final GraphOption graph = new GraphOption(); private Dat3mResult testResult; @@ -47,7 +50,6 @@ private Dat3M() { JMenuBar menuBar = new JMenuBar(); menuBar.add(editorsPane.getMenu()); - menuBar.add(graph.getMenu()); setJMenuBar(menuBar); JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editorsPane.getMainPane()); @@ -99,6 +101,14 @@ public void actionPerformed(ActionEvent event) { } } } else if(ControlCode.RELS.actionCommand().equals(command)){ + try { + editorsPane.getEditor(TARGET_MM).load(); + graph.getSelector().setTMM((Wmm) editorsPane.getEditor(TARGET_MM).getLoaded()); + editorsPane.getEditor(SOURCE_MM).load(); + graph.getSelector().setSMM((Wmm) editorsPane.getEditor(SOURCE_MM).getLoaded()); + } catch (Exception e) { + // Nothing to be done + } graph.getSelector().open(); } } diff --git a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java index c3646159ef..7403a6ea75 100644 --- a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java @@ -12,9 +12,6 @@ public class RelsButton extends JButton implements ActionListener { - private boolean drawGraphSelected = false; - //private boolean mmParsed = false; - public RelsButton() { super("Relation Selector"); setActionCommand(ControlCode.RELS.actionCommand()); @@ -22,15 +19,10 @@ public RelsButton() { setMaximumSize(new Dimension(OPTWIDTH/2, 50)); } - public void refreshButton() { - setEnabled(drawGraphSelected); - } - @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals(ControlCode.GRAPH.actionCommand())){ - drawGraphSelected = ((GraphButton)e.getSource()).isSelected(); - refreshButton(); + setEnabled(((GraphButton)e.getSource()).isSelected()); } } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 0b9bed404d..a968cb6dfb 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -1,13 +1,9 @@ package com.dat3m.ui.graph; -import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; -import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; import static java.awt.Toolkit.getDefaultToolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -17,40 +13,21 @@ import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuItem; import javax.swing.JScrollPane; import com.dat3m.dartagnan.utils.Graph; -import com.dat3m.dartagnan.wmm.Wmm; -import com.dat3m.ui.editor.EditorsPane; import com.dat3m.ui.result.Dat3mResult; import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; -public class GraphOption implements ActionListener { +public class GraphOption { private File dotFile = new File(".tmp/output.dot"); private File pngFile = new File(".tmp/output.png"); - // We need to load the MMs to populate the relation selector in the menu - private final EditorsPane editor; - private final JMenu menu; + //private final JMenu menu; private final RelSelector selector = new RelSelector(); - public GraphOption(EditorsPane editor) { - this.editor = editor; - this.menu = new JMenu("Graph Options"); - JMenuItem menuItem = new JMenuItem("Select Displayed Relations"); - menuItem.setActionCommand("menu_graph_relations"); - menuItem.addActionListener(this); - this.menu.add(menuItem); - } - - public JMenu getMenu(){ - return menu; - } - public RelSelector getSelector(){ return selector; } @@ -91,19 +68,4 @@ public void open() { frame.pack(); frame.setVisible(true); } - - @Override - public void actionPerformed(ActionEvent event) { - if(event.getActionCommand().equals("menu_graph_relations")){ - try { - editor.getEditor(TARGET_MM).load(); - selector.setTMM((Wmm) editor.getEditor(TARGET_MM).getLoaded()); - editor.getEditor(SOURCE_MM).load(); - selector.setSMM((Wmm) editor.getEditor(SOURCE_MM).getLoaded()); - } catch (Exception e) { - // Nothing to be done - } - selector.open(); - } - } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index 31b4e1aafa..3643389588 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -4,7 +4,10 @@ import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -40,8 +43,7 @@ public void open() { // To have the height based on the number of options int nButton = 0; - nButton = createButtons(tmm, radioPanel, nButton); - nButton = createButtons(smm, radioPanel, nButton); + nButton = createButtons(smm, tmm, radioPanel, nButton); // To have a minimal height when there are no relations nButton = Math.max(nButton, 2); @@ -51,25 +53,32 @@ public void open() { setVisible(true); } - private int createButtons(Wmm mm, JPanel radioPanel, int nButtom) { - if(mm != null) { - Set rels = mm.getRelationRepository().getRelations().stream() + private int createButtons(Wmm smm, Wmm tmm, JPanel radioPanel, int nButtom) { + List rels = new ArrayList<>(); + if(smm != null) { + rels.addAll(smm.getRelationRepository().getRelations().stream() .filter(ev -> !ev.getName().equals(ev.getTerm())) - .map(ev -> ev.getName()).collect(Collectors.toSet()); - for(String name : rels) { - if(names.contains(name)) { - continue; - } - names.add(name); - JRadioButton button = new JRadioButton(name); - button.setName(name); - button.addActionListener(this); - // To remember previous choice - button.setSelected(selection.contains(name)); - radioPanel.add(button); - nButtom ++; - } - } + .map(ev -> ev.getName()).collect(Collectors.toList())); + } + if(tmm != null) { + rels.addAll(tmm.getRelationRepository().getRelations().stream() + .filter(ev -> !ev.getName().equals(ev.getTerm())) + .map(ev -> ev.getName()).collect(Collectors.toList())); + } + Collections.sort(rels); + for(String name : rels) { + if(names.contains(name)) { + continue; + } + names.add(name); + JRadioButton button = new JRadioButton(name); + button.setName(name); + button.addActionListener(this); + // To remember previous choice + button.setSelected(selection.contains(name)); + radioPanel.add(button); + nButtom ++; + } return nButtom; } From 3e22a9afcf03f1d1e44bb3d9595f8a818ab76755 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Mon, 8 Apr 2019 23:23:43 +0200 Subject: [PATCH 124/145] Tested --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 52 ++++++++++------- .../java/com/dat3m/ui/button/GraphButton.java | 8 +-- .../java/com/dat3m/ui/button/RelsButton.java | 19 +++++- .../main/java/com/dat3m/ui/editor/Editor.java | 21 ------- .../java/com/dat3m/ui/graph/GraphOption.java | 2 +- .../java/com/dat3m/ui/graph/RelSelector.java | 58 +++++++++++-------- .../com/dat3m/ui/listener/EditorListener.java | 6 +- .../com/dat3m/ui/options/OptionsPane.java | 5 +- .../dat3m/ui/options/utils/ControlCode.java | 2 +- 9 files changed, 91 insertions(+), 82 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 0bf8dbef02..a45807564d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -1,5 +1,7 @@ package com.dat3m.ui; +import com.dat3m.dartagnan.parsers.cat.ParserCat; +import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.ui.editor.EditorsPane; @@ -64,8 +66,6 @@ private Dat3M() { // Start listening to button events optionsPane.getTestButton().addActionListener(this); - optionsPane.getClearButton().addActionListener(this); - optionsPane.getGraphButton().addActionListener(this); optionsPane.getRelsButton().addActionListener(this); // optionsPane needs to listen to editor to clean the console @@ -74,7 +74,7 @@ private Dat3M() { editorsPane.getEditor(EditorCode.TARGET_MM).addActionListener(optionsPane); // The console shall be cleaned every time the program or MM is modified from the editor - EditorListener listener = new EditorListener(optionsPane.getConsolePane(), optionsPane.getClearButton()); + EditorListener listener = new EditorListener(optionsPane.getConsolePane()); editorsPane.getEditor(EditorCode.PROGRAM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().addKeyListener(listener); @@ -96,21 +96,34 @@ public void actionPerformed(ActionEvent event) { runTest(); if(testResult != null){ optionsPane.getConsolePane().setText(testResult.getVerdict()); - if(optionsPane.getGraphButton().isSelected()) { + if(testResult.isSat() && optionsPane.getGraphButton().isSelected() && optionsPane.getGraphButton().isEnabled()) { EventQueue.invokeLater(graph::open); } } - } else if(ControlCode.RELS.actionCommand().equals(command)){ - try { - editorsPane.getEditor(TARGET_MM).load(); - graph.getSelector().setTMM((Wmm) editorsPane.getEditor(TARGET_MM).getLoaded()); - editorsPane.getEditor(SOURCE_MM).load(); - graph.getSelector().setSMM((Wmm) editorsPane.getEditor(SOURCE_MM).getLoaded()); - } catch (Exception e) { - // Nothing to be done + } + if(ControlCode.RELS.actionCommand().equals(command)){ + try { + Wmm tmm = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); + graph.getSelector().setTMM(tmm); + } catch (Exception e) { + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Target memory model error"); + return; } + if(optionsPane.getOptions().getTask().equals(Task.PORTABILITY)) { + try { + Wmm smm = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); + graph.getSelector().setSMM(smm); + } catch (Exception e) { + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Source memory model error"); + return; + } + } else if(optionsPane.getOptions().getTask().equals(Task.REACHABILITY)) { + graph.getSelector().setSMM(null); + } graph.getSelector().open(); - } + } } private void runTest(){ @@ -118,12 +131,9 @@ private void runTest(){ testResult = null; try { Editor programEditor = editorsPane.getEditor(EditorCode.PROGRAM); - programEditor.load(); - Program program = (Program) programEditor.getLoaded(); + Program program = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); try { - Editor targetEditor = editorsPane.getEditor(EditorCode.TARGET_MM); - targetEditor.load(); - Wmm targetModel = (Wmm) targetEditor.getLoaded(); + Wmm targetModel = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); if(options.getTask() == Task.REACHABILITY){ testResult = new ReachabilityResult(program, targetModel, options, graph); } else { @@ -132,10 +142,8 @@ private void runTest(){ showError("PORTHOS only supports *.pts files", "Loading error"); return; } - Program sourceProgram = (Program) programEditor.getLoaded(); - Editor sourceEditor = editorsPane.getEditor(EditorCode.SOURCE_MM); - sourceEditor.load(); - Wmm sourceModel = (Wmm) sourceEditor.getLoaded(); + Program sourceProgram = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); + Wmm sourceModel = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options, graph); } catch (Exception e){ String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); diff --git a/ui/src/main/java/com/dat3m/ui/button/GraphButton.java b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java index 0b5e3e2395..e55063536f 100644 --- a/ui/src/main/java/com/dat3m/ui/button/GraphButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/GraphButton.java @@ -10,7 +10,6 @@ import javax.swing.JComboBox; import javax.swing.JRadioButton; -import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.ui.options.utils.ControlCode; public class GraphButton extends JRadioButton implements ActionListener { @@ -18,14 +17,15 @@ public class GraphButton extends JRadioButton implements ActionListener { public GraphButton() { super("Draw Graph"); setActionCommand(ControlCode.GRAPH.actionCommand()); + setEnabled(false); + setToolTipText("Knaster-Tarski mode does not allow to generate execution graph"); setMaximumSize(new Dimension(OPTWIDTH/2, 50)); } - @SuppressWarnings("unchecked") @Override public void actionPerformed(ActionEvent e) { - if(e.getActionCommand().equals(ControlCode.MODE.actionCommand())){ - setEnabled(!(((JComboBox)e.getSource()).getSelectedItem()).equals(KNASTER)); + if(e.getActionCommand().equals(ControlCode.MODE.actionCommand()) && e.getSource() instanceof JComboBox){ + setEnabled(!(((JComboBox)e.getSource()).getSelectedItem()).equals(KNASTER)); } } } diff --git a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java index 7403a6ea75..be04c9513b 100644 --- a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java @@ -1,5 +1,6 @@ package com.dat3m.ui.button; +import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; import java.awt.Dimension; @@ -7,22 +8,36 @@ import java.awt.event.ActionListener; import javax.swing.JButton; +import javax.swing.JComboBox; import com.dat3m.ui.options.utils.ControlCode; public class RelsButton extends JButton implements ActionListener { + private boolean graphSelected = false; + private boolean modeAllowed = false; + public RelsButton() { super("Relation Selector"); setActionCommand(ControlCode.RELS.actionCommand()); setEnabled(false); + setToolTipText("Knaster-Tarski mode does not allow to generate execution graph"); setMaximumSize(new Dimension(OPTWIDTH/2, 50)); } + public void refresh() { + setEnabled(graphSelected && modeAllowed); + } + @Override public void actionPerformed(ActionEvent e) { - if(e.getActionCommand().equals(ControlCode.GRAPH.actionCommand())){ - setEnabled(((GraphButton)e.getSource()).isSelected()); + if(e.getActionCommand().equals(ControlCode.GRAPH.actionCommand()) && e.getSource() instanceof GraphButton){ + graphSelected = ((GraphButton)e.getSource()).isSelected(); + refresh(); + } + if(e.getActionCommand().equals(ControlCode.MODE.actionCommand()) && e.getSource() instanceof JComboBox){ + modeAllowed = !(((JComboBox)e.getSource()).getSelectedItem()).equals(KNASTER); + refresh(); } } } diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index 7089e6ddfd..354f645290 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -1,7 +1,5 @@ package com.dat3m.ui.editor; -import com.dat3m.dartagnan.parsers.cat.ParserCat; -import com.dat3m.dartagnan.parsers.program.ProgramParser; import com.google.common.collect.ImmutableSet; import javax.swing.*; @@ -16,9 +14,6 @@ import java.io.InputStreamReader; import java.util.*; -import static com.dat3m.ui.editor.EditorCode.PROGRAM; -import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; -import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static com.dat3m.ui.utils.Utils.showError; import static java.lang.System.getProperty; import static javax.swing.BorderFactory.createTitledBorder; @@ -28,8 +23,6 @@ public class Editor extends JScrollPane implements ActionListener { private final EditorCode code; - private Object loaded; - private final JEditorPane editorPane; private final JMenuItem menuItem; private final JFileChooser chooser; @@ -73,20 +66,6 @@ public String getLoadedFormat(){ return loadedFormat; } - public void load() { - if(code.equals(PROGRAM)) { - loaded = new ProgramParser().parse(editorPane.getText(), loadedFormat); - } else if(code.equals(SOURCE_MM)) { - loaded = new ParserCat().parse(editorPane.getText()); - } else if(code.equals(TARGET_MM)) { - loaded = new ParserCat().parse(editorPane.getText()); - } - } - - public Object getLoaded() { - return loaded; - } - @Override public void actionPerformed(ActionEvent event) { if(code.editorMenuActionCommand().equals(event.getActionCommand())){ diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index a968cb6dfb..21190f3a60 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -40,7 +40,7 @@ public void generate(Dat3mResult res) { for(File f : files) { if (f.getParentFile() != null) { f.getParentFile().mkdirs(); - } + } f.createNewFile(); } Graph graph = res.getGraph(); diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index 3643389588..a5e912d69e 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -1,12 +1,12 @@ package com.dat3m.ui.graph; -import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -19,10 +19,13 @@ public class RelSelector extends JFrame implements ActionListener { + private static final int COLS = 5; + private Wmm tmm; private Wmm smm; // To avoid repeating names of common relations between both MM private Set names; + // To remember previous selections private Set selection = new HashSet<>(); public void setTMM(Wmm mm) { @@ -39,34 +42,37 @@ public Set getSelection() { public void open() { names = new HashSet<>(); - JPanel radioPanel = new JPanel(new GridLayout(0, 1)); - // To have the height based on the number of options - int nButton = 0; - - nButton = createButtons(smm, tmm, radioPanel, nButton); - // To have a minimal height when there are no relations - nButton = Math.max(nButton, 2); - radioPanel.setPreferredSize(new Dimension(200, nButton * 30)); + setTitle("Relations"); + List relButtons = createButtons(smm, tmm); + JPanel radioPanel = new JPanel(new GridLayout(relButtons.size() / COLS, COLS)); + + Iterator it = relButtons.iterator(); + while(it.hasNext()) { + radioPanel.add(it.next()); + } setContentPane(radioPanel); pack(); setVisible(true); } - private int createButtons(Wmm smm, Wmm tmm, JPanel radioPanel, int nButtom) { - List rels = new ArrayList<>(); + private List createButtons(Wmm smm, Wmm tmm) { + List ret = new ArrayList<>(); + + List relNames = new ArrayList<>(); if(smm != null) { - rels.addAll(smm.getRelationRepository().getRelations().stream() + relNames.addAll(smm.getRelationRepository().getRelations().stream() .filter(ev -> !ev.getName().equals(ev.getTerm())) .map(ev -> ev.getName()).collect(Collectors.toList())); } if(tmm != null) { - rels.addAll(tmm.getRelationRepository().getRelations().stream() + relNames.addAll(tmm.getRelationRepository().getRelations().stream() .filter(ev -> !ev.getName().equals(ev.getTerm())) .map(ev -> ev.getName()).collect(Collectors.toList())); } - Collections.sort(rels); - for(String name : rels) { + Collections.sort(relNames); + + for(String name : relNames) { if(names.contains(name)) { continue; } @@ -76,20 +82,22 @@ private int createButtons(Wmm smm, Wmm tmm, JPanel radioPanel, int nButtom) { button.addActionListener(this); // To remember previous choice button.setSelected(selection.contains(name)); - radioPanel.add(button); - nButtom ++; - } - return nButtom; + ret.add(button); + } + + return ret; } @Override public void actionPerformed(ActionEvent e) { - JRadioButton button = (JRadioButton)e.getSource(); - String name = button.getName(); - if(button.isSelected()) { - selection.add(name); - } else { - selection.remove(name); + if(e.getSource() instanceof JRadioButton) { + JRadioButton button = (JRadioButton)e.getSource(); + String name = button.getName(); + if(button.isSelected()) { + selection.add(name); + } else { + selection.remove(name); + } } } } diff --git a/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java index 52b90c3df1..8a3ca9f158 100644 --- a/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java +++ b/ui/src/main/java/com/dat3m/ui/listener/EditorListener.java @@ -3,17 +3,14 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import javax.swing.JButton; import javax.swing.JTextPane; public class EditorListener implements KeyListener { private JTextPane consolePane; - private JButton clearButton; - public EditorListener(JTextPane pane, JButton button) { + public EditorListener(JTextPane pane) { this.consolePane = pane; - this.clearButton = button; } @Override @@ -29,6 +26,5 @@ public void keyReleased(KeyEvent e) { @Override public void keyTyped(KeyEvent e) { consolePane.setText(""); - clearButton.setEnabled(false); } } diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 3655564479..d2168ce2b9 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -90,8 +90,11 @@ private void bindListeners(){ sourcePane.addActionListener(this); boundField.addActionListener(this); clearButton.addActionListener(this); - graphButton.addActionListener(relsButton); + // Enabling graph options depends on mode modePane.addActionListener(graphButton); + // Enabling rel selector depends on mode and graph button + modePane.addActionListener(relsButton); + graphButton.addActionListener(relsButton); } public Selector getTaskPane(){ diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java index f7b10e17ea..a091d0fee9 100644 --- a/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ControlCode.java @@ -26,7 +26,7 @@ public String toString(){ case GRAPH: return "Graph"; case RELS: - return "Select Relations"; + return "Relations"; } return super.toString(); } From 810de1723550b2de73633570e8a2a0069548035c Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Mon, 8 Apr 2019 23:41:58 +0200 Subject: [PATCH 125/145] Columns number in rel selector --- ui/src/main/java/com/dat3m/ui/graph/RelSelector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index a5e912d69e..16757b2c04 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -45,7 +45,7 @@ public void open() { setTitle("Relations"); List relButtons = createButtons(smm, tmm); - JPanel radioPanel = new JPanel(new GridLayout(relButtons.size() / COLS, COLS)); + JPanel radioPanel = new JPanel(new GridLayout(0, COLS)); Iterator it = relButtons.iterator(); while(it.hasNext()) { From b88e0b1aa3efac073be3399f991cbd3b6016424a Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 9 Apr 2019 15:34:45 +0300 Subject: [PATCH 126/145] Fixed graph relations in WMMs --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 86 ++++++++++--------- .../java/com/dat3m/ui/graph/GraphOption.java | 7 -- .../java/com/dat3m/ui/options/Options.java | 27 +++++- .../com/dat3m/ui/options/OptionsPane.java | 23 +++-- .../dat3m/ui/result/PortabilityResult.java | 58 +++++++++---- .../dat3m/ui/result/ReachabilityResult.java | 50 +++++++---- 6 files changed, 164 insertions(+), 87 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 124e23ffda..2a4f74a409 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -104,7 +104,7 @@ public void actionPerformed(ActionEvent event) { if(ControlCode.RELS.actionCommand().equals(command)){ try { Wmm tmm = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); - graph.getSelector().setTMM(tmm); + optionsPane.getRelSelector().setTMM(tmm); } catch (Exception e) { String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Target memory model error"); @@ -113,58 +113,60 @@ public void actionPerformed(ActionEvent event) { if(optionsPane.getOptions().getTask().equals(Task.PORTABILITY)) { try { Wmm smm = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); - graph.getSelector().setSMM(smm); + optionsPane.getRelSelector().setSMM(smm); } catch (Exception e) { String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Source memory model error"); return; } } else if(optionsPane.getOptions().getTask().equals(Task.REACHABILITY)) { - graph.getSelector().setSMM(null); + optionsPane.getRelSelector().setSMM(null); } - graph.getSelector().open(); + optionsPane.getRelSelector().open(); } } private void runTest(){ Options options = optionsPane.getOptions(); - testResult = null; - try { - Editor programEditor = editorsPane.getEditor(EditorCode.PROGRAM); - Program program = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); - try { - Wmm targetModel = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); - if(options.getTask() == Task.REACHABILITY){ - testResult = new ReachabilityResult(program, targetModel, options, graph); - } else { - try { - if(!programEditor.getLoadedFormat().equals("pts")) { - showError("PORTHOS only supports *.pts files", "Loading error"); - return; - } - Program sourceProgram = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); - Wmm sourceModel = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); - testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options, graph); - } catch (Exception e){ - String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError(msg, "Source memory model error"); - } - } - } catch (Exception e){ - String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError(msg, "Target memory model error"); - } - } catch (Exception e){ - String msg = e.getMessage() == null? "Program cannot be parsed" : e.getMessage(); - Throwable cause = e.getCause(); - if(cause instanceof InputMismatchException) { - Token token = ((InputMismatchException)cause).getOffendingToken(); - msg = "Problem with \"" + token.getText() + "\" at line " + token.getLine(); - } - showError(msg, "Program error"); - } - if(testResult != null && testResult.getGraph() != null) { - graph.generate(testResult); - } + if(options.validate()){ + testResult = null; + try { + Editor programEditor = editorsPane.getEditor(EditorCode.PROGRAM); + Program program = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); + try { + Wmm targetModel = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); + if(options.getTask() == Task.REACHABILITY){ + testResult = new ReachabilityResult(program, targetModel, options); + } else { + try { + if(!programEditor.getLoadedFormat().equals("pts")) { + showError("PORTHOS only supports *.pts files", "Loading error"); + return; + } + Program sourceProgram = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); + Wmm sourceModel = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); + testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); + } catch (Exception e){ + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError(msg, "Source memory model error"); + } + } + } catch (Exception e){ + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError(msg, "Target memory model error"); + } + } catch (Exception e){ + String msg = e.getMessage() == null? "Program cannot be parsed" : e.getMessage(); + Throwable cause = e.getCause(); + if(cause instanceof InputMismatchException) { + Token token = ((InputMismatchException)cause).getOffendingToken(); + msg = "Problem with \"" + token.getText() + "\" at line " + token.getLine(); + } + showError(msg, "Program error"); + } + if(testResult != null && testResult.getGraph() != null) { + graph.generate(testResult); + } + } } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 8f119aaa99..1ce7b8da0b 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -25,13 +25,6 @@ public class GraphOption { private File dotFile = new File(".tmp/output.dot"); private File pngFile = new File(".tmp/output.png"); - //private final JMenu menu; - private final RelSelector selector = new RelSelector(); - - public RelSelector getSelector(){ - return selector; - } - public void generate(Dat3mResult result) { Graph graph = result.getGraph(); if(graph != null) { diff --git a/ui/src/main/java/com/dat3m/ui/options/Options.java b/ui/src/main/java/com/dat3m/ui/options/Options.java index a465544d8a..83cb4801aa 100644 --- a/ui/src/main/java/com/dat3m/ui/options/Options.java +++ b/ui/src/main/java/com/dat3m/ui/options/Options.java @@ -4,6 +4,10 @@ import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.dartagnan.wmm.utils.alias.Alias; import com.dat3m.ui.utils.Task; +import com.dat3m.ui.utils.Utils; +import com.google.common.collect.ImmutableSet; + +import java.util.Collection; public class Options { @@ -13,14 +17,19 @@ public class Options { private final Mode mode; private final Alias alias; private final int bound; + private final boolean drawGraph; + private final ImmutableSet relations; - public Options(Task task, Arch target, Arch source, Mode mode, Alias alias, int bound) { + Options(Task task, Arch target, Arch source, Mode mode, Alias alias, int bound, + boolean drawGraph, Collection relations) { this.task = task; this.source = source; this.target = target; this.mode = mode; this.alias = alias; this.bound = bound; + this.drawGraph = drawGraph; + this.relations = relations == null ? ImmutableSet.of() : ImmutableSet.copyOf(relations); } public Task getTask() { @@ -46,4 +55,20 @@ public Alias getAlias() { public int getBound() { return bound; } + + public boolean getDrawGraph(){ + return drawGraph; + } + + public ImmutableSet getRelations(){ + return relations; + } + + public boolean validate(){ + if(drawGraph && mode.equals(Mode.KNASTER)){ + Utils.showError("Execution graph is not available in Knaster-Tarski encoding mode"); + return false; + } + return true; + } } diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 973643f681..583d173ee9 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -7,6 +7,7 @@ import com.dat3m.ui.button.GraphButton; import com.dat3m.ui.button.RelsButton; import com.dat3m.ui.button.TestButton; +import com.dat3m.ui.graph.RelSelector; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.options.utils.ArchManager; import com.dat3m.ui.options.utils.ControlCode; @@ -50,19 +51,21 @@ public class OptionsPane extends JPanel implements ActionListener { private final JTextPane consolePane; + private final RelSelector relSelector; + public OptionsPane(){ super(new GridLayout(1,0)); iconPane = new IconPane(IconCode.DARTAGNAN, getIconHeight(), JLabel.CENTER); - taskPane = new Selector(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); - modePane = new Selector(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); - aliasPane = new Selector(EnumSet.allOf(Alias.class).toArray(new Alias[0]), ControlCode.ALIAS); + taskPane = new Selector<>(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); + modePane = new Selector<>(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); + aliasPane = new Selector<>(EnumSet.allOf(Alias.class).toArray(new Alias[0]), ControlCode.ALIAS); Arch[] architectures = EnumSet.allOf(Arch.class).toArray(new Arch[0]); - sourcePane = new Selector(architectures, ControlCode.SOURCE); + sourcePane = new Selector<>(architectures, ControlCode.SOURCE); sourcePane.setEnabled(false); - targetPane = new Selector(architectures, ControlCode.TARGET); + targetPane = new Selector<>(architectures, ControlCode.TARGET); archManager = new ArchManager(sourcePane, targetPane); boundField = new BoundField(); @@ -75,6 +78,8 @@ public OptionsPane(){ consolePane = new JTextPane(); consolePane.setEditable(false); + relSelector = new RelSelector(); + bindListeners(); mkGrid(); } @@ -136,6 +141,10 @@ public JTextPane getConsolePane(){ return consolePane; } + public RelSelector getRelSelector(){ + return relSelector; + } + public Options getOptions(){ return new Options( (Task)taskPane.getSelectedItem(), @@ -143,7 +152,9 @@ public Options getOptions(){ (Arch)sourcePane.getSelectedItem(), (Mode)modePane.getSelectedItem(), (Alias)aliasPane.getSelectedItem(), - Integer.parseInt(boundField.getText()) + Integer.parseInt(boundField.getText()), + graphButton.isEnabled() && graphButton.isSelected(), + relSelector.getSelection() ); } diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index aa92916855..d6f44569f1 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -3,10 +3,11 @@ import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.utils.Graph; import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; -import com.dat3m.ui.graph.GraphOption; import com.dat3m.ui.options.Options; +import com.dat3m.ui.utils.Utils; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; @@ -18,17 +19,15 @@ public class PortabilityResult implements Dat3mResult { private final Wmm targetWmm; private final Options options; - private GraphOption gOptions; private Graph graph; private String verdict; - public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourceWmm, Wmm targetWmm, Options options, GraphOption gOptions){ + public PortabilityResult(Program sourceProgram, Program targetProgram, Wmm sourceWmm, Wmm targetWmm, Options options){ this.sourceProgram = sourceProgram; this.targetProgram = targetProgram; this.sourceWmm = sourceWmm; this.targetWmm = targetWmm; this.options = options; - this.gOptions = gOptions; run(); } @@ -41,21 +40,48 @@ public String getVerdict(){ } private void run(){ - Context ctx = new Context(); - Solver s1 = ctx.mkSolver(); - Solver s2 = ctx.mkSolver(); + if(validate()){ + Context ctx = new Context(); + Solver s1 = ctx.mkSolver(); + Solver s2 = ctx.mkSolver(); - PorthosResult result = Porthos.testProgram(s1, s2, ctx, sourceProgram, targetProgram, options.getSource(), - options.getTarget(), sourceWmm, targetWmm, options.getBound(), options.getMode(), options.getAlias()); + if(options.getDrawGraph()) { + sourceWmm.setDrawExecutionGraph(); + targetWmm.setDrawExecutionGraph(); + sourceWmm.addDrawRelations(Graph.getDefaultRelations()); + targetWmm.addDrawRelations(Graph.getDefaultRelations()); + sourceWmm.addDrawRelations(options.getRelations()); + targetWmm.addDrawRelations(options.getRelations()); + } - verdict = "The program is" + (result.getIsPortable() ? " " : " not ") + "state-portable\n" - + "Iterations: " + result.getIterations(); + PorthosResult result = Porthos.testProgram(s1, s2, ctx, sourceProgram, targetProgram, sourceProgram.getArch(), + targetProgram.getArch(), sourceWmm, targetWmm, options.getBound(), options.getMode(), options.getAlias()); - if(!result.getIsPortable()){ - graph = new Graph(s1.getModel(), ctx); - graph.addRelations(gOptions.getSelector().getSelection()); - graph.build(sourceProgram, targetProgram); + verdict = "The program is" + (result.getIsPortable() ? " " : " not ") + "state-portable\n" + + "Iterations: " + result.getIterations(); + + if(!result.getIsPortable()){ + graph = new Graph(s1.getModel(), ctx); + graph.addRelations(options.getRelations()); + graph.build(sourceProgram, targetProgram); + } + ctx.close(); + } + } + + private boolean validate(){ + Arch sourceArch = sourceProgram.getArch() == null ? options.getSource() : sourceProgram.getArch(); + if(sourceArch == null) { + Utils.showError("Missing source architecture."); + return false; + } + Arch targetArch = targetProgram.getArch() == null ? options.getTarget() : targetProgram.getArch(); + if(targetArch == null) { + Utils.showError("Missing target architecture."); + return false; } - ctx.close(); + sourceProgram.setArch(sourceArch); + targetProgram.setArch(targetArch); + return true; } } diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index b9a37c90a6..de3d4e4eb1 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -5,8 +5,8 @@ import com.dat3m.dartagnan.utils.Graph; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; -import com.dat3m.ui.graph.GraphOption; import com.dat3m.ui.options.Options; +import com.dat3m.ui.utils.Utils; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; @@ -16,14 +16,12 @@ public class ReachabilityResult implements Dat3mResult { private final Wmm wmm; private final Options options; - private GraphOption gOptions; private Graph graph; private String verdict; - public ReachabilityResult(Program program, Wmm wmm, Options options, GraphOption gOptions){ + public ReachabilityResult(Program program, Wmm wmm, Options options){ this.program = program; this.wmm = wmm; - this.gOptions = gOptions; this.options = options; run(); } @@ -37,20 +35,28 @@ public String getVerdict(){ } private void run(){ - Context ctx = new Context(); - Solver solver = ctx.mkSolver(); - Arch target = program.getArch() == null ? options.getTarget() : program.getArch(); - boolean result = Dartagnan.testProgram(solver, ctx, program, wmm, target, options.getBound(), - options.getMode(), options.getAlias()); + if(validate()){ + Context ctx = new Context(); + Solver solver = ctx.mkSolver(); + + if(options.getDrawGraph()) { + wmm.setDrawExecutionGraph(); + wmm.addDrawRelations(Graph.getDefaultRelations()); + wmm.addDrawRelations(options.getRelations()); + } - buildVerdict(result); + boolean result = Dartagnan.testProgram(solver, ctx, program, wmm, program.getArch(), options.getBound(), + options.getMode(), options.getAlias()); - if(Dartagnan.canDrawGraph(program.getAss(), result)){ - graph = new Graph(solver.getModel(), ctx); - graph.addRelations(gOptions.getSelector().getSelection()); - graph.build(program); + buildVerdict(result); + + if(options.getDrawGraph() && Dartagnan.canDrawGraph(program.getAss(), result)){ + graph = new Graph(solver.getModel(), ctx); + graph.addRelations(options.getRelations()); + graph.build(program); + } + ctx.close(); } - ctx.close(); } private void buildVerdict(boolean result){ @@ -62,4 +68,18 @@ private void buildVerdict(boolean result){ sb.append(result ? "OK" : "No").append("\n"); verdict = sb.toString(); } + + private boolean validate(){ + Arch target = program.getArch() == null ? options.getTarget() : program.getArch(); + if(target == null) { + Utils.showError("Missing target architecture."); + return false; + } + if(program.getAss() == null){ + Utils.showError("Program must include assertion clause."); + return false; + } + program.setArch(target); + return true; + } } From ba6c28b522614f06f59e596ec17826c90d481868 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 9 Apr 2019 16:56:46 +0300 Subject: [PATCH 127/145] Minor refactoring --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 27 +--- .../java/com/dat3m/ui/button/RelsButton.java | 33 ++--- .../java/com/dat3m/ui/graph/RelSelector.java | 118 +++++++++--------- .../com/dat3m/ui/options/OptionsPane.java | 26 +--- .../java/com/dat3m/ui/options/Selector.java | 2 +- 5 files changed, 85 insertions(+), 121 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 2a4f74a409..79c2ed93af 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -66,7 +66,6 @@ private Dat3M() { // Start listening to button events optionsPane.getTestButton().addActionListener(this); - optionsPane.getRelsButton().addActionListener(this); // optionsPane needs to listen to editor to clean the console editorsPane.getEditor(EditorCode.PROGRAM).addActionListener(optionsPane); @@ -79,6 +78,9 @@ private Dat3M() { editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().addKeyListener(listener); editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().addKeyListener(listener); + optionsPane.getRelSelector().setSourceWmmEditor(editorsPane.getEditor(EditorCode.SOURCE_MM)); + optionsPane.getRelSelector().setTargetWmmEditor(editorsPane.getEditor(EditorCode.TARGET_MM)); + pack(); } @@ -101,29 +103,6 @@ public void actionPerformed(ActionEvent event) { } } } - if(ControlCode.RELS.actionCommand().equals(command)){ - try { - Wmm tmm = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); - optionsPane.getRelSelector().setTMM(tmm); - } catch (Exception e) { - String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Target memory model error"); - return; - } - if(optionsPane.getOptions().getTask().equals(Task.PORTABILITY)) { - try { - Wmm smm = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); - optionsPane.getRelSelector().setSMM(smm); - } catch (Exception e) { - String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); - showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Source memory model error"); - return; - } - } else if(optionsPane.getOptions().getTask().equals(Task.REACHABILITY)) { - optionsPane.getRelSelector().setSMM(null); - } - optionsPane.getRelSelector().open(); - } } private void runTest(){ diff --git a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java index be04c9513b..b93c4f913c 100644 --- a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java @@ -1,8 +1,5 @@ package com.dat3m.ui.button; -import static com.dat3m.dartagnan.wmm.utils.Mode.KNASTER; -import static com.dat3m.ui.options.OptionsPane.OPTWIDTH; - import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -10,34 +7,42 @@ import javax.swing.JButton; import javax.swing.JComboBox; +import com.dat3m.dartagnan.wmm.utils.Mode; +import com.dat3m.ui.graph.RelSelector; +import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.options.utils.ControlCode; public class RelsButton extends JButton implements ActionListener { private boolean graphSelected = false; private boolean modeAllowed = false; + private final RelSelector relSelector; - public RelsButton() { + public RelsButton(RelSelector relSelector) { super("Relation Selector"); + this.relSelector = relSelector; setActionCommand(ControlCode.RELS.actionCommand()); - setEnabled(false); setToolTipText("Knaster-Tarski mode does not allow to generate execution graph"); - setMaximumSize(new Dimension(OPTWIDTH/2, 50)); - } - - public void refresh() { - setEnabled(graphSelected && modeAllowed); + setMaximumSize(new Dimension(OptionsPane.OPTWIDTH / 2, 50)); + setEnabled(false); + addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { - if(e.getActionCommand().equals(ControlCode.GRAPH.actionCommand()) && e.getSource() instanceof GraphButton){ + String command = e.getActionCommand(); + if(ControlCode.GRAPH.actionCommand().equals(command)){ graphSelected = ((GraphButton)e.getSource()).isSelected(); refresh(); - } - if(e.getActionCommand().equals(ControlCode.MODE.actionCommand()) && e.getSource() instanceof JComboBox){ - modeAllowed = !(((JComboBox)e.getSource()).getSelectedItem()).equals(KNASTER); + } else if(ControlCode.MODE.actionCommand().equals(command)){ + modeAllowed = Mode.KNASTER != ((JComboBox)e.getSource()).getSelectedItem(); refresh(); + } else if(ControlCode.RELS.actionCommand().equals(command)){ + relSelector.open(); } } + + private void refresh() { + setEnabled(graphSelected && modeAllowed); + } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java index 16757b2c04..a544ff4e87 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java @@ -3,37 +3,40 @@ import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; +import com.dat3m.dartagnan.parsers.cat.ParserCat; import com.dat3m.dartagnan.wmm.Wmm; +import com.dat3m.dartagnan.wmm.relation.Relation; +import com.dat3m.ui.editor.Editor; +import com.dat3m.ui.options.Selector; +import com.dat3m.ui.utils.Task; + +import static com.dat3m.ui.utils.Utils.showError; public class RelSelector extends JFrame implements ActionListener { private static final int COLS = 5; - private Wmm tmm; - private Wmm smm; - // To avoid repeating names of common relations between both MM - private Set names; - // To remember previous selections + private final Selector taskSelector; + private Editor sourceWmmEditor; + private Editor targetWmmEditor; private Set selection = new HashSet<>(); - - public void setTMM(Wmm mm) { - this.tmm = mm; + + public RelSelector(Selector taskSelector){ + this.taskSelector = taskSelector; + } + + public void setSourceWmmEditor(Editor editor){ + sourceWmmEditor = editor; } - public void setSMM(Wmm mm) { - this.smm = mm; + public void setTargetWmmEditor(Editor editor){ + targetWmmEditor = editor; } public Set getSelection() { @@ -41,51 +44,48 @@ public Set getSelection() { } public void open() { - names = new HashSet<>(); - - setTitle("Relations"); - List relButtons = createButtons(smm, tmm); - JPanel radioPanel = new JPanel(new GridLayout(0, COLS)); - - Iterator it = relButtons.iterator(); - while(it.hasNext()) { - radioPanel.add(it.next()); - } - setContentPane(radioPanel); - pack(); - setVisible(true); + SortedSet relations = mkRelations(); + if(relations != null){ + setTitle("Relations"); + JPanel radioPanel = new JPanel(new GridLayout(0, COLS)); + for(String relation : relations){ + JRadioButton button = new JRadioButton(relation); + button.setName(relation); + button.addActionListener(this); + button.setSelected(selection.contains(relation)); + radioPanel.add(button); + } + setContentPane(radioPanel); + pack(); + setVisible(true); + } } - private List createButtons(Wmm smm, Wmm tmm) { - List ret = new ArrayList<>(); - - List relNames = new ArrayList<>(); - if(smm != null) { - relNames.addAll(smm.getRelationRepository().getRelations().stream() - .filter(ev -> !ev.getName().equals(ev.getTerm())) - .map(ev -> ev.getName()).collect(Collectors.toList())); + private SortedSet mkRelations(){ + SortedSet relations = new TreeSet<>(); + try { + addWmmRelations(relations, targetWmmEditor); + if(Task.PORTABILITY == taskSelector.getSelectedItem()){ + addWmmRelations(relations, sourceWmmEditor); + } + return relations; + } catch (Exception e){ + String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); + showError("Relation Selector requires the memory model to be correctly parsed.\n" + msg, "Memory model error"); + return null; + } + } + + private void addWmmRelations(SortedSet set, Editor editor){ + if(editor == null){ + throw new RuntimeException("Editor is not set in " + getClass().getName()); + } + Wmm wmm = new ParserCat().parse(editor.getEditorPane().getText()); + for(Relation relation : wmm.getRelationRepository().getRelations()){ + if(!relation.getName().equals(relation.getTerm())){ + set.add(relation.getName()); + } } - if(tmm != null) { - relNames.addAll(tmm.getRelationRepository().getRelations().stream() - .filter(ev -> !ev.getName().equals(ev.getTerm())) - .map(ev -> ev.getName()).collect(Collectors.toList())); - } - Collections.sort(relNames); - - for(String name : relNames) { - if(names.contains(name)) { - continue; - } - names.add(name); - JRadioButton button = new JRadioButton(name); - button.setName(name); - button.addActionListener(this); - // To remember previous choice - button.setSelected(selection.contains(name)); - ret.add(button); - } - - return ret; } @Override diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 583d173ee9..ab800a1137 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -73,13 +73,13 @@ public OptionsPane(){ testButton = new TestButton(); clearButton = new ClearButton(); graphButton = new GraphButton(); - relsButton = new RelsButton(); + + relSelector = new RelSelector(taskPane); + relsButton = new RelsButton(relSelector); consolePane = new JTextPane(); consolePane.setEditable(false); - relSelector = new RelSelector(); - bindListeners(); mkGrid(); } @@ -105,38 +105,18 @@ public Selector getTaskPane(){ return taskPane; } - public Selector getTargetPane(){ - return targetPane; - } - - public Selector getSourcePane(){ - return sourcePane; - } - public ArchManager getArchManager(){ return archManager; } - public BoundField getBoundPane(){ - return boundField; - } - public JButton getTestButton(){ return testButton; } - public JButton getClearButton(){ - return clearButton; - } - public GraphButton getGraphButton(){ return graphButton; } - public RelsButton getRelsButton(){ - return relsButton; - } - public JTextPane getConsolePane(){ return consolePane; } diff --git a/ui/src/main/java/com/dat3m/ui/options/Selector.java b/ui/src/main/java/com/dat3m/ui/options/Selector.java index 95dfeb69e7..b6e4fcf851 100644 --- a/ui/src/main/java/com/dat3m/ui/options/Selector.java +++ b/ui/src/main/java/com/dat3m/ui/options/Selector.java @@ -27,7 +27,7 @@ public void addActionListener(ActionListener listener){ selector.addActionListener(listener); } - Object getSelectedItem(){ + public Object getSelectedItem(){ return selector.getSelectedItem(); } } From b31b7613f6f4dac8d0b90cf6cfd912388b9f2d4f Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Tue, 9 Apr 2019 20:00:12 +0200 Subject: [PATCH 128/145] Solved AArch64 tests not parsed from UI --- .../java/com/dat3m/dartagnan/parsers/program/ProgramParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 8a2e0cd15a..70ed98d727 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -29,7 +29,7 @@ public Program parse(String raw, String format) { if(format.equals("pts")){ return new ParserPorthos().parse(CharStreams.fromString(raw)); } else if(format.equals("litmus")){ - return getConcreteLitmusParser(raw).parse(CharStreams.fromString(raw)); + return getConcreteLitmusParser(raw.toUpperCase()).parse(CharStreams.fromString(raw)); } throw new ParsingException("Unknown input file type"); } From 819259f1e0ecf49a17b692fe3f2e2e99efdf20f7 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Wed, 10 Apr 2019 11:53:36 +0300 Subject: [PATCH 129/145] Refactoring of Graph: part 1 --- .../java/com/dat3m/dartagnan/Dartagnan.java | 15 +++-- .../java/com/dat3m/dartagnan/utils/Graph.java | 38 ++++++------ .../main/java/com/dat3m/porthos/Porthos.java | 9 +-- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 +- .../java/com/dat3m/ui/graph/GraphOption.java | 58 ++++++------------- .../dat3m/ui/result/PortabilityResult.java | 4 +- .../dat3m/ui/result/ReachabilityResult.java | 4 +- 7 files changed, 51 insertions(+), 82 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index 91f79726d0..21a1ee2ca3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -16,6 +16,7 @@ import org.apache.commons.cli.*; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; @@ -113,13 +114,10 @@ public static void main(String[] args) throws IOException { System.out.println(result ? "Ok" : "No"); if(cmd.hasOption("draw") && canDrawGraph(p.getAss(), result)) { - Graph graph = new Graph(s.getModel(), ctx); String outputPath = cmd.getOptionValue("draw"); + String[] relations = cmd.hasOption("rels") ? cmd.getOptionValue("rels").split(",") : new String[0]; ctx.setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB_FULL); - if(cmd.hasOption("rels")) { - graph.addRelations(Arrays.asList(cmd.getOptionValue("rels").split(","))); - } - graph.build(p).draw(outputPath); + drawGraph(new Graph(s.getModel(), ctx, p, relations), outputPath); System.out.println("Execution graph is written to " + outputPath); } @@ -159,4 +157,11 @@ public static boolean canDrawGraph(AbstractAssert ass, boolean result){ } return type.equals(AbstractAssert.ASSERT_TYPE_NOT_EXISTS) || type.equals(AbstractAssert.ASSERT_TYPE_FORALL); } + + public static void drawGraph(Graph graph, String path) throws IOException { + File newTextFile = new File(path); + FileWriter fw = new FileWriter(newTextFile); + fw.write(graph.toString()); + fw.close(); + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java index 80ec0cc1e0..f152d7a33c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/Graph.java @@ -10,9 +10,6 @@ import com.dat3m.dartagnan.program.event.MemEvent; import com.dat3m.dartagnan.program.memory.Location; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,27 +46,38 @@ public static Set getDefaultRelations(){ private final String DEFAULT_EDGE_COLOR = "indigo"; - public Graph(Model model, Context ctx){ + public Graph(Model model, Context ctx, Program program, String... relations){ + this(model, ctx, relations); + build(program); + } + + public Graph(Model model, Context ctx, Program pSource, Program pTarget, String... relations){ + this(model, ctx, relations); + build(pSource, pTarget); + } + + private Graph(Model model, Context ctx, String... relations){ this.model = model; this.ctx = ctx; - relations.add("rf"); + this.relations.add("rf"); + this.relations.addAll(Arrays.asList(relations)); } - public void addRelations(Collection relations){ - this.relations.addAll(relations); + @Override + public String toString(){ + return buffer.toString(); } - public Graph build(Program program){ + private void build(Program program){ buffer = new StringBuilder(); buffer.append("digraph G {\n") .append(L1).append("subgraph cluster_Target { ").append(getProgramDef(targetLabel)).append("\n") .append(buildProgramGraph(program)) .append(L1).append("}\n") .append("}\n"); - return this; } - public Graph build(Program pSource, Program pTarget){ + private void build(Program pSource, Program pTarget){ buffer = new StringBuilder(); buffer.append("digraph G {\n"); @@ -83,16 +91,6 @@ public Graph build(Program pSource, Program pTarget){ .append(L1).append("}\n"); buffer.append("}\n"); - - return this; - } - - public File draw(String filename) throws IOException { - File newTextFile = new File(filename); - FileWriter fw = new FileWriter(newTextFile); - fw.write(buffer.toString()); - fw.close(); - return newTextFile; } private StringBuilder buildProgramGraph(Program program){ diff --git a/porthos/src/main/java/com/dat3m/porthos/Porthos.java b/porthos/src/main/java/com/dat3m/porthos/Porthos.java index f5365a5ab3..9d8ebe7bc5 100644 --- a/porthos/src/main/java/com/dat3m/porthos/Porthos.java +++ b/porthos/src/main/java/com/dat3m/porthos/Porthos.java @@ -120,13 +120,10 @@ public static void main(String[] args) throws IOException { System.out.println("The program is not state-portable"); System.out.println("Iterations: " + result.getIterations()); if(cmd.hasOption("draw")) { - ctx.setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB_FULL); - Graph graph = new Graph(s1.getModel(), ctx); String outputPath = cmd.getOptionValue("draw"); - if(cmd.hasOption("rels")) { - graph.addRelations(Arrays.asList(cmd.getOptionValue("rels").split(","))); - } - graph.build(result.getSourceProgram(), result.getTargetProgram()).draw(outputPath); + String[] relations = cmd.hasOption("rels") ? cmd.getOptionValue("rels").split(",") : new String[0]; + ctx.setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB_FULL); + Dartagnan.drawGraph(new Graph(s1.getModel(), ctx, pSource, pTarget, relations), outputPath); System.out.println("Execution graph is written to " + outputPath); } } diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 79c2ed93af..3cbd774940 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -99,7 +99,7 @@ public void actionPerformed(ActionEvent event) { if(testResult != null){ optionsPane.getConsolePane().setText(testResult.getVerdict()); if(testResult.getGraph() != null && optionsPane.getGraphButton().isSelected() && optionsPane.getGraphButton().isEnabled()) { - EventQueue.invokeLater(graph::open); + graph.open(testResult.getGraph()); } } } @@ -143,9 +143,6 @@ private void runTest(){ } showError(msg, "Program error"); } - if(testResult != null && testResult.getGraph() != null) { - graph.generate(testResult); - } } } } diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java index 1ce7b8da0b..3abac136af 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java @@ -2,64 +2,40 @@ import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; -import static java.awt.Toolkit.getDefaultToolkit; -import java.io.File; -import java.io.FileInputStream; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; -import java.util.List; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import com.dat3m.dartagnan.utils.Graph; -import com.dat3m.ui.result.Dat3mResult; +import com.dat3m.ui.utils.Utils; import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; public class GraphOption { - private File dotFile = new File(".tmp/output.dot"); - private File pngFile = new File(".tmp/output.png"); - - public void generate(Dat3mResult result) { - Graph graph = result.getGraph(); + public void open(Graph graph) { if(graph != null) { try { - List files = Arrays.asList(dotFile, pngFile); - // Create the file and parent directory if they do not exist - for(File f : files) { - if (f.getParentFile() != null) { - f.getParentFile().mkdirs(); - } - f.createNewFile(); - } - File dot2File = graph.draw(dotFile.getAbsolutePath()); - // The previous png file needs to be deleted - pngFile.delete(); - InputStream targetStream = new FileInputStream(dot2File); - MutableGraph g = Parser.read(targetStream); - fromGraph(g).render(PNG).toFile(pngFile); - - } catch (IOException e) { - // This should never happen since the file is always created + JLabel label = new JLabel(); + InputStream stream = new ByteArrayInputStream(graph.toString().getBytes()); + MutableGraph g = Parser.read(stream); + label.setIcon(new ImageIcon(fromGraph(g).render(PNG).toImage())); + JScrollPane scroll = new JScrollPane(label); + scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + JFrame frame = new JFrame(); + frame.add(scroll); + frame.pack(); + frame.setVisible(true); + + } catch (IOException e){ + Utils.showError("Failed to render a graph"); } } } - - public void open() { - JLabel label = new JLabel(); - // An image need to be created at every call since the image changes - label.setIcon(new ImageIcon(getDefaultToolkit().createImage(pngFile.getAbsolutePath()))); - JScrollPane scroll = new JScrollPane(label); - scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - JFrame frame = new JFrame(); - frame.add(scroll); - frame.pack(); - frame.setVisible(true); - } } diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index d6f44569f1..9ea9b79f68 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -61,9 +61,7 @@ private void run(){ + "Iterations: " + result.getIterations(); if(!result.getIsPortable()){ - graph = new Graph(s1.getModel(), ctx); - graph.addRelations(options.getRelations()); - graph.build(sourceProgram, targetProgram); + graph = new Graph(s1.getModel(), ctx, sourceProgram, targetProgram, options.getRelations().toArray(new String[0])); } ctx.close(); } diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index de3d4e4eb1..379a4f987f 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -51,9 +51,7 @@ private void run(){ buildVerdict(result); if(options.getDrawGraph() && Dartagnan.canDrawGraph(program.getAss(), result)){ - graph = new Graph(solver.getModel(), ctx); - graph.addRelations(options.getRelations()); - graph.build(program); + graph = new Graph(solver.getModel(), ctx, program, options.getRelations().toArray(new String[0])); } ctx.close(); } From 8b9cd77dba96c29b4b6c2533c1f625c49f34ae02 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Wed, 10 Apr 2019 12:06:18 +0300 Subject: [PATCH 130/145] Refactored package structure --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 9 ++++----- .../main/java/com/dat3m/ui/button/RelsButton.java | 2 +- .../java/com/dat3m/ui/editor/EditorsPane.java | 2 +- .../main/java/com/dat3m/ui/options/IconPane.java | 2 +- .../java/com/dat3m/ui/options/OptionsPane.java | 4 ++-- .../dat3m/ui/{graph => options}/RelSelector.java | 15 +++++++-------- .../com/dat3m/ui/options/utils/ArchManager.java | 1 - .../com/dat3m/ui/options/{ => utils}/Options.java | 5 ++--- .../com/dat3m/ui/{ => options}/utils/Task.java | 2 +- .../com/dat3m/ui/result/PortabilityResult.java | 2 +- .../com/dat3m/ui/result/ReachabilityResult.java | 2 +- .../GraphOption.java => utils/GraphUtils.java} | 7 +++---- 12 files changed, 24 insertions(+), 29 deletions(-) rename ui/src/main/java/com/dat3m/ui/{graph => options}/RelSelector.java (93%) rename ui/src/main/java/com/dat3m/ui/options/{ => utils}/Options.java (90%) rename ui/src/main/java/com/dat3m/ui/{ => options}/utils/Task.java (89%) rename ui/src/main/java/com/dat3m/ui/{graph/GraphOption.java => utils/GraphUtils.java} (90%) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 3cbd774940..680b505817 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -10,14 +10,14 @@ import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; import com.dat3m.ui.listener.EditorListener; -import com.dat3m.ui.graph.GraphOption; -import com.dat3m.ui.options.Options; +import com.dat3m.ui.utils.GraphUtils; +import com.dat3m.ui.options.utils.Options; import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.options.utils.ControlCode; import com.dat3m.ui.result.Dat3mResult; import com.dat3m.ui.result.PortabilityResult; import com.dat3m.ui.result.ReachabilityResult; -import com.dat3m.ui.utils.Task; +import com.dat3m.ui.options.utils.Task; import javax.swing.*; import org.antlr.v4.runtime.InputMismatchException; @@ -37,7 +37,6 @@ public class Dat3M extends JFrame implements ActionListener { private final OptionsPane optionsPane = new OptionsPane(); private final EditorsPane editorsPane = new EditorsPane(); - private final GraphOption graph = new GraphOption(); private Dat3mResult testResult; @@ -99,7 +98,7 @@ public void actionPerformed(ActionEvent event) { if(testResult != null){ optionsPane.getConsolePane().setText(testResult.getVerdict()); if(testResult.getGraph() != null && optionsPane.getGraphButton().isSelected() && optionsPane.getGraphButton().isEnabled()) { - graph.open(testResult.getGraph()); + GraphUtils.showGraph(testResult.getGraph()); } } } diff --git a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java index b93c4f913c..3a791941e8 100644 --- a/ui/src/main/java/com/dat3m/ui/button/RelsButton.java +++ b/ui/src/main/java/com/dat3m/ui/button/RelsButton.java @@ -8,7 +8,7 @@ import javax.swing.JComboBox; import com.dat3m.dartagnan.wmm.utils.Mode; -import com.dat3m.ui.graph.RelSelector; +import com.dat3m.ui.options.RelSelector; import com.dat3m.ui.options.OptionsPane; import com.dat3m.ui.options.utils.ControlCode; diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index 97765c3ffa..ed21fc090a 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -1,7 +1,7 @@ package com.dat3m.ui.editor; import com.dat3m.ui.options.utils.ControlCode; -import com.dat3m.ui.utils.Task; +import com.dat3m.ui.options.utils.Task; import com.google.common.collect.ImmutableMap; import javax.swing.*; diff --git a/ui/src/main/java/com/dat3m/ui/options/IconPane.java b/ui/src/main/java/com/dat3m/ui/options/IconPane.java index a7ea0c7eca..638a72880c 100644 --- a/ui/src/main/java/com/dat3m/ui/options/IconPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/IconPane.java @@ -3,7 +3,7 @@ import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.icon.IconHelper; import com.dat3m.ui.options.utils.ControlCode; -import com.dat3m.ui.utils.Task; +import com.dat3m.ui.options.utils.Task; import javax.swing.*; import java.awt.event.ActionEvent; diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index ab800a1137..719dbfcbc5 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -7,11 +7,11 @@ import com.dat3m.ui.button.GraphButton; import com.dat3m.ui.button.RelsButton; import com.dat3m.ui.button.TestButton; -import com.dat3m.ui.graph.RelSelector; import com.dat3m.ui.icon.IconCode; import com.dat3m.ui.options.utils.ArchManager; import com.dat3m.ui.options.utils.ControlCode; -import com.dat3m.ui.utils.Task; +import com.dat3m.ui.options.utils.Options; +import com.dat3m.ui.options.utils.Task; import javax.swing.*; import javax.swing.border.Border; diff --git a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java b/ui/src/main/java/com/dat3m/ui/options/RelSelector.java similarity index 93% rename from ui/src/main/java/com/dat3m/ui/graph/RelSelector.java rename to ui/src/main/java/com/dat3m/ui/options/RelSelector.java index a544ff4e87..ca167a1f1a 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/RelSelector.java +++ b/ui/src/main/java/com/dat3m/ui/options/RelSelector.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.graph; +package com.dat3m.ui.options; import java.awt.GridLayout; import java.awt.event.ActionEvent; @@ -13,8 +13,7 @@ import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.relation.Relation; import com.dat3m.ui.editor.Editor; -import com.dat3m.ui.options.Selector; -import com.dat3m.ui.utils.Task; +import com.dat3m.ui.options.utils.Task; import static com.dat3m.ui.utils.Utils.showError; @@ -27,10 +26,14 @@ public class RelSelector extends JFrame implements ActionListener { private Editor targetWmmEditor; private Set selection = new HashSet<>(); - public RelSelector(Selector taskSelector){ + RelSelector(Selector taskSelector){ this.taskSelector = taskSelector; } + Set getSelection() { + return selection; + } + public void setSourceWmmEditor(Editor editor){ sourceWmmEditor = editor; } @@ -39,10 +42,6 @@ public void setTargetWmmEditor(Editor editor){ targetWmmEditor = editor; } - public Set getSelection() { - return selection; - } - public void open() { SortedSet relations = mkRelations(); if(relations != null){ diff --git a/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java index 6f8b091baa..040c4ad4ae 100644 --- a/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/ArchManager.java @@ -4,7 +4,6 @@ import com.dat3m.ui.editor.Editor; import com.dat3m.ui.editor.EditorCode; import com.dat3m.ui.options.Selector; -import com.dat3m.ui.utils.Task; import javax.swing.*; import java.awt.event.ActionEvent; diff --git a/ui/src/main/java/com/dat3m/ui/options/Options.java b/ui/src/main/java/com/dat3m/ui/options/utils/Options.java similarity index 90% rename from ui/src/main/java/com/dat3m/ui/options/Options.java rename to ui/src/main/java/com/dat3m/ui/options/utils/Options.java index 83cb4801aa..598fb5b913 100644 --- a/ui/src/main/java/com/dat3m/ui/options/Options.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/Options.java @@ -1,9 +1,8 @@ -package com.dat3m.ui.options; +package com.dat3m.ui.options.utils; import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.dartagnan.wmm.utils.Mode; import com.dat3m.dartagnan.wmm.utils.alias.Alias; -import com.dat3m.ui.utils.Task; import com.dat3m.ui.utils.Utils; import com.google.common.collect.ImmutableSet; @@ -20,7 +19,7 @@ public class Options { private final boolean drawGraph; private final ImmutableSet relations; - Options(Task task, Arch target, Arch source, Mode mode, Alias alias, int bound, + public Options(Task task, Arch target, Arch source, Mode mode, Alias alias, int bound, boolean drawGraph, Collection relations) { this.task = task; this.source = source; diff --git a/ui/src/main/java/com/dat3m/ui/utils/Task.java b/ui/src/main/java/com/dat3m/ui/options/utils/Task.java similarity index 89% rename from ui/src/main/java/com/dat3m/ui/utils/Task.java rename to ui/src/main/java/com/dat3m/ui/options/utils/Task.java index 4edfa09663..d547bb1c9b 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/Task.java +++ b/ui/src/main/java/com/dat3m/ui/options/utils/Task.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.utils; +package com.dat3m.ui.options.utils; public enum Task { diff --git a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java index 9ea9b79f68..8b19a8b2ad 100644 --- a/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/PortabilityResult.java @@ -6,7 +6,7 @@ import com.dat3m.dartagnan.wmm.utils.Arch; import com.dat3m.porthos.Porthos; import com.dat3m.porthos.PorthosResult; -import com.dat3m.ui.options.Options; +import com.dat3m.ui.options.utils.Options; import com.dat3m.ui.utils.Utils; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; diff --git a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java index 379a4f987f..cddfea68ff 100644 --- a/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java +++ b/ui/src/main/java/com/dat3m/ui/result/ReachabilityResult.java @@ -5,7 +5,7 @@ import com.dat3m.dartagnan.utils.Graph; import com.dat3m.dartagnan.wmm.Wmm; import com.dat3m.dartagnan.wmm.utils.Arch; -import com.dat3m.ui.options.Options; +import com.dat3m.ui.options.utils.Options; import com.dat3m.ui.utils.Utils; import com.microsoft.z3.Context; import com.microsoft.z3.Solver; diff --git a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java similarity index 90% rename from ui/src/main/java/com/dat3m/ui/graph/GraphOption.java rename to ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java index 3abac136af..8828753b30 100644 --- a/ui/src/main/java/com/dat3m/ui/graph/GraphOption.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java @@ -1,4 +1,4 @@ -package com.dat3m.ui.graph; +package com.dat3m.ui.utils; import static guru.nidi.graphviz.engine.Format.PNG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; @@ -12,13 +12,12 @@ import javax.swing.JScrollPane; import com.dat3m.dartagnan.utils.Graph; -import com.dat3m.ui.utils.Utils; import guru.nidi.graphviz.model.MutableGraph; import guru.nidi.graphviz.parse.Parser; -public class GraphOption { +public class GraphUtils { - public void open(Graph graph) { + public static void showGraph(Graph graph) { if(graph != null) { try { JLabel label = new JLabel(); From 3fbc40bf96cdfda61bc7ee41f5f06891997a3353 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Wed, 10 Apr 2019 12:22:38 +0300 Subject: [PATCH 131/145] Format of graph image changed to svg --- ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java index 8828753b30..54522a4a46 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java @@ -1,6 +1,6 @@ package com.dat3m.ui.utils; -import static guru.nidi.graphviz.engine.Format.PNG; +import static guru.nidi.graphviz.engine.Format.SVG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; import java.io.ByteArrayInputStream; @@ -23,7 +23,7 @@ public static void showGraph(Graph graph) { JLabel label = new JLabel(); InputStream stream = new ByteArrayInputStream(graph.toString().getBytes()); MutableGraph g = Parser.read(stream); - label.setIcon(new ImageIcon(fromGraph(g).render(PNG).toImage())); + label.setIcon(new ImageIcon(fromGraph(g).render(SVG).toImage())); JScrollPane scroll = new JScrollPane(label); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); From 89d634f10e5bacfc568dc628717252f7215d8454 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Wed, 10 Apr 2019 12:29:50 +0300 Subject: [PATCH 132/145] Removed unused Arch --- .../com/dat3m/dartagnan/wmm/utils/Arch.java | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java index 98f7799a3e..4146a8a460 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Arch.java @@ -1,7 +1,7 @@ package com.dat3m.dartagnan.wmm.utils; public enum Arch { - NONE, ALPHA, ARM, ARM8, POWER, PSO, RMO, TSO; + NONE, ARM, ARM8, POWER, TSO; public static Arch get(String arch){ if(arch != null){ @@ -9,18 +9,12 @@ public static Arch get(String arch){ switch(arch){ case "none": return NONE; - case "alpha": - throw new UnsupportedOperationException("Unsupported architecture alpha"); case "arm": return ARM; case "arm8": return ARM8; case "power": return POWER; - case "pso": - throw new UnsupportedOperationException("Unsupported architecture pso"); - case "rmo": - throw new UnsupportedOperationException("Unsupported architecture rmo"); case "tso": return TSO; } @@ -28,39 +22,20 @@ public static Arch get(String arch){ throw new UnsupportedOperationException("Unrecognized architecture " + arch); } - public boolean getIncludePoToCtrl(){ - switch(this) { - case ALPHA: - case ARM: - case ARM8: - case POWER: - case RMO: - return true; - default: - return false; - } - } - @Override public String toString() { switch(this){ case NONE: return "none"; - case ALPHA: - return "alpha"; case ARM: return "arm"; case ARM8: return "arm8"; case POWER: return "power"; - case PSO: - return "pso"; - case RMO: - return "rmo"; case TSO: return "tso"; } return super.toString(); } -} \ No newline at end of file +} From 8fe7ef47a85b27aecf328f09a2071b54dcba391b Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Wed, 10 Apr 2019 12:37:22 +0300 Subject: [PATCH 133/145] Minor refactoring --- .../com/dat3m/ui/editor/LineNumbersView.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java index caba5245cb..cd8b171c08 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java +++ b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java @@ -23,11 +23,12 @@ class LineNumbersView extends JComponent implements CaretListener, ComponentListener, ActionListener { - private JTextComponent editor; - private Font font; + private final JTextComponent editor; + private final Font font; - public LineNumbersView(JTextComponent editor) { + LineNumbersView(JTextComponent editor) { this.editor = editor; + this.font = new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize()); editor.addComponentListener(this); editor.addCaretListener(this); } @@ -47,7 +48,6 @@ public void paintComponent(Graphics g) { int x = getInsets().left + 2; int y = getOffsetY(startOffset); - font = font != null ? font : new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize()); g.setFont(font); g.setColor(isCurrentLine(startOffset) ? Color.RED : Color.BLACK); @@ -56,9 +56,9 @@ public void paintComponent(Graphics g) { } startOffset = Utilities.getRowEnd(editor, startOffset) + 1; + } catch (BadLocationException e) { e.printStackTrace(); - // ignore and continue } } } @@ -72,7 +72,6 @@ private String getLineNumber(int offset) { Element root = editor.getDocument().getDefaultRootElement(); int index = root.getElementIndex(offset); Element line = root.getElement(index); - return line.getStartOffset() == offset ? String.format("%3d", index + 1) : null; } @@ -83,11 +82,8 @@ private String getLineNumber(int offset) { private int getOffsetY(int offset) throws BadLocationException { FontMetrics fontMetrics = editor.getFontMetrics(editor.getFont()); int descent = fontMetrics.getDescent(); - Rectangle r = editor.modelToView(offset); - int y = r.y + r.height - descent; - - return y; + return r.y + r.height - descent; } /** @@ -104,9 +100,7 @@ private boolean isCurrentLine(int offset) { * Schedules a refresh of the line number margin on a separate thread. */ private void documentChanged() { - SwingUtilities.invokeLater(() -> { - repaint(); - }); + SwingUtilities.invokeLater(this::repaint); } /** From dec33a26941a22f61691c56af6968b01057e7201 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Wed, 10 Apr 2019 13:52:30 +0200 Subject: [PATCH 134/145] Simplified line numbering class --- .../com/dat3m/ui/editor/LineNumbersView.java | 140 +++++------------- 1 file changed, 39 insertions(+), 101 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java index cd8b171c08..0796ca4fd8 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java +++ b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java @@ -1,144 +1,82 @@ package com.dat3m.ui.editor; +import static java.lang.String.valueOf; +import static javax.swing.text.Utilities.getRowEnd; + import java.awt.Color; import java.awt.Dimension; import java.awt.Font; -import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; - import javax.swing.JComponent; -import javax.swing.SwingUtilities; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.BadLocationException; import javax.swing.text.Element; import javax.swing.text.JTextComponent; -import javax.swing.text.Utilities; -class LineNumbersView extends JComponent implements CaretListener, ComponentListener, ActionListener { +class LineNumbersView extends JComponent implements CaretListener, ActionListener { - private final JTextComponent editor; - private final Font font; + private final JTextComponent editor; LineNumbersView(JTextComponent editor) { - this.editor = editor; - this.font = new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize()); - editor.addComponentListener(this); - editor.addCaretListener(this); + this.editor = editor; + editor.addCaretListener(this); + Dimension size = new Dimension(28, editor.getHeight()); + setPreferredSize(size); + setSize(size); } @Override public void paintComponent(Graphics g) { - super.paintComponent(g); - - Rectangle clip = g.getClipBounds(); - int startOffset = editor.viewToModel(new Point(0, clip.y)); - int endOffset = editor.viewToModel(new Point(0, clip.y + clip.height)); - - while (startOffset <= endOffset) { - try { - String lineNumber = getLineNumber(startOffset); - if (lineNumber != null) { - int x = getInsets().left + 2; - int y = getOffsetY(startOffset); - - g.setFont(font); - - g.setColor(isCurrentLine(startOffset) ? Color.RED : Color.BLACK); - - g.drawString(lineNumber, x, y); - } - - startOffset = Utilities.getRowEnd(editor, startOffset) + 1; - - } catch (BadLocationException e) { - e.printStackTrace(); - } - } + super.paintComponent(g); + + Rectangle clip = g.getClipBounds(); + int currentOffset = editor.viewToModel(new Point(0, clip.y)); + int endOffset = editor.viewToModel(new Point(0, clip.y + clip.height)); + + while (currentOffset <= endOffset) { + try { + // Computes the line number based on the offset + int lineNumber = editor.getDocument().getDefaultRootElement().getElementIndex(currentOffset) + 1; + // x position of the line number is fixed + int x = getInsets().left + 2; + // y position is different for each line number + int y = getOffsetY(currentOffset); + + g.setFont(new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize())); + g.setColor(isCurrentLine(currentOffset) ? Color.RED : Color.BLACK); + g.drawString(valueOf(lineNumber), x, y); + + // Update offset + currentOffset = getRowEnd(editor, currentOffset) + 1; + } catch (BadLocationException e) { + e.printStackTrace(); + } + } } - /** - * Returns the line number of the element based on the given (start) offset - * in the editor model. Returns null if no line number should or could be - * provided (e.g. for wrapped lines). - */ - private String getLineNumber(int offset) { - Element root = editor.getDocument().getDefaultRootElement(); - int index = root.getElementIndex(offset); - Element line = root.getElement(index); - return line.getStartOffset() == offset ? String.format("%3d", index + 1) : null; - } - - /** - * Returns the y axis position for the line number belonging to the element - * at the given (start) offset in the model. - */ private int getOffsetY(int offset) throws BadLocationException { - FontMetrics fontMetrics = editor.getFontMetrics(editor.getFont()); - int descent = fontMetrics.getDescent(); + int descent = editor.getFontMetrics(editor.getFont()).getDescent(); Rectangle r = editor.modelToView(offset); return r.y + r.height - descent; } - /** - * Returns true if the given start offset in the model is the selected (by - * cursor position) element. - */ private boolean isCurrentLine(int offset) { - int caretPosition = editor.getCaretPosition(); Element root = editor.getDocument().getDefaultRootElement(); - return root.getElementIndex(offset) == root.getElementIndex(caretPosition); - } - - /** - * Schedules a refresh of the line number margin on a separate thread. - */ - private void documentChanged() { - SwingUtilities.invokeLater(this::repaint); - } - - /** - * Updates the size of the line number margin based on the editor height. - */ - private void updateSize() { - Dimension size = new Dimension(28, editor.getHeight()); - setPreferredSize(size); - setSize(size); + return root.getElementIndex(offset) == root.getElementIndex(editor.getCaretPosition()); } @Override public void caretUpdate(CaretEvent e) { - documentChanged(); - } - - @Override - public void componentResized(ComponentEvent e) { - updateSize(); - documentChanged(); - } - - @Override - public void componentMoved(ComponentEvent e) { - } - - @Override - public void componentShown(ComponentEvent e) { - updateSize(); - documentChanged(); - } - - @Override - public void componentHidden(ComponentEvent e) { + repaint(); } @Override public void actionPerformed(ActionEvent e) { - documentChanged(); + repaint(); } } \ No newline at end of file From e4f5c4f68dbbc4d44c19d3f6bf37818644816617 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Wed, 10 Apr 2019 14:12:03 +0200 Subject: [PATCH 135/145] Scale graph size based on screen size --- ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java index 54522a4a46..eb51a5f1f0 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java @@ -3,6 +3,9 @@ import static guru.nidi.graphviz.engine.Format.SVG; import static guru.nidi.graphviz.engine.Graphviz.fromGraph; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -23,7 +26,11 @@ public static void showGraph(Graph graph) { JLabel label = new JLabel(); InputStream stream = new ByteArrayInputStream(graph.toString().getBytes()); MutableGraph g = Parser.read(stream); - label.setIcon(new ImageIcon(fromGraph(g).render(SVG).toImage())); + BufferedImage image = fromGraph(g).render(SVG).toImage(); + int height = (int) Math.round(Toolkit.getDefaultToolkit().getScreenSize().getHeight()) * 5/6; + int width = image.getWidth() * height / image.getHeight(); + Image scaledImage = image.getScaledInstance(width, height, Image.SCALE_SMOOTH); + label.setIcon(new ImageIcon(scaledImage)); JScrollPane scroll = new JScrollPane(label); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); @@ -31,7 +38,6 @@ public static void showGraph(Graph graph) { frame.add(scroll); frame.pack(); frame.setVisible(true); - } catch (IOException e){ Utils.showError("Failed to render a graph"); } From ba8b56ef4336cb16b5001d867d44434af793c061 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Thu, 11 Apr 2019 10:14:40 +0200 Subject: [PATCH 136/145] Added support to export editors into files --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 5 ++- .../main/java/com/dat3m/ui/editor/Editor.java | 44 ++++++++++++++++--- .../java/com/dat3m/ui/editor/EditorCode.java | 20 +++++++-- .../java/com/dat3m/ui/editor/EditorsPane.java | 27 ++++++++---- 4 files changed, 76 insertions(+), 20 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index 680b505817..e290131fff 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -50,7 +50,10 @@ private Dat3M() { setIconImage(IconHelper.getIcon(IconCode.DAT3M).getImage()); JMenuBar menuBar = new JMenuBar(); - menuBar.add(editorsPane.getMenu()); + JMenu fileMenu = new JMenu("File"); + fileMenu.add(editorsPane.getMenuImporter()); + fileMenu.add(editorsPane.getMenuExporter()); + menuBar.add(fileMenu); setJMenuBar(menuBar); JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, optionsPane, editorsPane.getMainPane()); diff --git a/ui/src/main/java/com/dat3m/ui/editor/Editor.java b/ui/src/main/java/com/dat3m/ui/editor/Editor.java index 354f645290..8d224b92db 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/Editor.java +++ b/ui/src/main/java/com/dat3m/ui/editor/Editor.java @@ -10,6 +10,7 @@ import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; @@ -24,7 +25,8 @@ public class Editor extends JScrollPane implements ActionListener { private final EditorCode code; private final JEditorPane editorPane; - private final JMenuItem menuItem; + private final JMenuItem importerItem; + private final JMenuItem exporterItem; private final JFileChooser chooser; private final LineNumbersView lineNumbers; @@ -39,9 +41,12 @@ public class Editor extends JScrollPane implements ActionListener { this.editorPane = editorPane; this.lineNumbers = new LineNumbersView(editorPane); this.addActionListener(lineNumbers); - this.menuItem = new JMenuItem(code.toString()); - menuItem.setActionCommand(code.editorMenuActionCommand()); - menuItem.addActionListener(this); + this.importerItem = new JMenuItem(code.toString()); + importerItem.setActionCommand(code.editorMenuImportActionCommand()); + importerItem.addActionListener(this); + this.exporterItem = new JMenuItem(code.toString()); + exporterItem.setActionCommand(code.editorMenuExportActionCommand()); + exporterItem.addActionListener(this); this.allowedFormats = ImmutableSet.copyOf(Arrays.asList(formats)); this.chooser = new JFileChooser(); @@ -68,7 +73,7 @@ public String getLoadedFormat(){ @Override public void actionPerformed(ActionEvent event) { - if(code.editorMenuActionCommand().equals(event.getActionCommand())){ + if(code.editorMenuImportActionCommand().equals(event.getActionCommand())){ chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); if(chooser.showOpenDialog(null) == APPROVE_OPTION){ String path = chooser.getSelectedFile().getPath(); @@ -87,10 +92,35 @@ public void actionPerformed(ActionEvent event) { } } } + if(code.editorMenuExportActionCommand().equals(event.getActionCommand())){ + chooser.setCurrentDirectory(new File(getProperty("user.dir") + "/..")); + if(chooser.showSaveDialog(null) == APPROVE_OPTION){ + String path = chooser.getSelectedFile().getPath(); + String format = path.substring(path.lastIndexOf('.') + 1).trim(); + if(allowedFormats.contains(format)){ + notifyListeners(); + try { + File newTextFile = new File(path); + FileWriter fw = new FileWriter(newTextFile); + fw.write(editorPane.getText()); + fw.close(); + } catch (IOException e) { + // This should never happen since the file is created above + } + } else { + showError("Please select a *." + String.join(", *.", allowedFormats) + " file", + "Invalid file format"); + } + } + } + } + + JMenuItem getImporterItem(){ + return importerItem; } - JMenuItem getMenuItem(){ - return menuItem; + JMenuItem getExporterItem(){ + return exporterItem; } public JEditorPane getEditorPane(){ diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java index 1a58e397a7..e29dfc1b9b 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorCode.java @@ -17,14 +17,26 @@ public String toString(){ return super.toString(); } - public String editorMenuActionCommand(){ + public String editorMenuImportActionCommand(){ switch(this){ case PROGRAM: - return "editor_menu_action_program"; + return "editor_menu_import_action_program"; case SOURCE_MM: - return "editor_menu_action_source_mm"; + return "editor_menu_import_action_source_mm"; case TARGET_MM: - return "editor_menu_action_target_mm"; + return "editor_menu_import_action_target_mm"; + } + throw new RuntimeException("Illegal EditorCode"); + } + + public String editorMenuExportActionCommand(){ + switch(this){ + case PROGRAM: + return "editor_menu_export_action_program"; + case SOURCE_MM: + return "editor_menu_export_action_source_mm"; + case TARGET_MM: + return "editor_menu_export_action_target_mm"; } throw new RuntimeException("Illegal EditorCode"); } diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index ed21fc090a..3bde36056d 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -21,12 +21,17 @@ EditorCode.TARGET_MM, new Editor(EditorCode.TARGET_MM, new JEditorPane(), "cat") private final JSplitPane mmPane; private final JSplitPane mainPane; - private final JMenu menu; + private final JMenu menuImporter; + private final JMenu menuExporter; public EditorsPane(){ - menu = new JMenu("Import"); - menu.add(editors.get(EditorCode.PROGRAM).getMenuItem()); - menu.add(editors.get(EditorCode.TARGET_MM).getMenuItem()); + menuImporter = new JMenu("Import"); + menuImporter.add(editors.get(EditorCode.PROGRAM).getImporterItem()); + menuImporter.add(editors.get(EditorCode.TARGET_MM).getImporterItem()); + + menuExporter = new JMenu("Export"); + menuExporter.add(editors.get(EditorCode.PROGRAM).getExporterItem()); + menuExporter.add(editors.get(EditorCode.TARGET_MM).getExporterItem()); Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); Dimension editorsDimension = new Dimension((int)(2 * screenDimension.getWidth() / 5), (int)screenDimension.getHeight()); @@ -46,8 +51,12 @@ public EditorsPane(){ mainPane.setBorder(new TitledBorder("")); } - public JMenu getMenu(){ - return menu; + public JMenu getMenuImporter(){ + return menuImporter; + } + + public JMenu getMenuExporter(){ + return menuExporter; } public JSplitPane getMainPane(){ @@ -66,10 +75,12 @@ public void actionPerformed(ActionEvent event) { mmPane.setTopComponent(editors.get(EditorCode.SOURCE_MM)); mmPane.setDividerSize(2); mmPane.setDividerLocation(0.5); - menu.add(editors.get(EditorCode.SOURCE_MM).getMenuItem(), 1); + menuImporter.add(editors.get(EditorCode.SOURCE_MM).getImporterItem(), 1); + menuExporter.add(editors.get(EditorCode.SOURCE_MM).getExporterItem(), 1); } else { mmPane.remove(editors.get(EditorCode.SOURCE_MM)); - menu.remove(editors.get(EditorCode.SOURCE_MM).getMenuItem()); + menuImporter.remove(editors.get(EditorCode.SOURCE_MM).getImporterItem()); + menuExporter.remove(editors.get(EditorCode.SOURCE_MM).getExporterItem()); } } } From 617cc8f0168697cb8b39027b73ec825e7daa7659 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Fri, 12 Apr 2019 09:52:34 +0200 Subject: [PATCH 137/145] Graph windows's height = Screen height --- ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java index eb51a5f1f0..1eb5e43bd1 100644 --- a/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java +++ b/ui/src/main/java/com/dat3m/ui/utils/GraphUtils.java @@ -27,7 +27,7 @@ public static void showGraph(Graph graph) { InputStream stream = new ByteArrayInputStream(graph.toString().getBytes()); MutableGraph g = Parser.read(stream); BufferedImage image = fromGraph(g).render(SVG).toImage(); - int height = (int) Math.round(Toolkit.getDefaultToolkit().getScreenSize().getHeight()) * 5/6; + int height = (int) Math.round(Toolkit.getDefaultToolkit().getScreenSize().getHeight()); int width = image.getWidth() * height / image.getHeight(); Image scaledImage = image.getScaledInstance(width, height, Image.SCALE_SMOOTH); label.setIcon(new ImageIcon(scaledImage)); From 96d4e60a24f74ad899e027bed316d38e1f2bd2c5 Mon Sep 17 00:00:00 2001 From: ponce Date: Fri, 12 Apr 2019 10:13:45 +0200 Subject: [PATCH 138/145] Making all options fit in small display --- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 719dbfcbc5..4c1362e73b 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -56,7 +56,8 @@ public class OptionsPane extends JPanel implements ActionListener { public OptionsPane(){ super(new GridLayout(1,0)); - iconPane = new IconPane(IconCode.DARTAGNAN, getIconHeight(), JLabel.CENTER); + int height = Math.min(getIconHeight(), (int) Math.round(Toolkit.getDefaultToolkit().getScreenSize().getHeight()) * 7 / 18); + iconPane = new IconPane(IconCode.DARTAGNAN, height, JLabel.CENTER); taskPane = new Selector<>(EnumSet.allOf(Task.class).toArray(new Task[0]), ControlCode.TASK); modePane = new Selector<>(EnumSet.allOf(Mode.class).toArray(new Mode[0]), ControlCode.MODE); @@ -154,7 +155,7 @@ private void mkGrid(){ JSplitPane archPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); archPane.setLeftComponent(sourcePane); archPane.setRightComponent(targetPane); - archPane.setPreferredSize(new Dimension(OPTWIDTH, 0)); + archPane.setMaximumSize(new Dimension(OPTWIDTH, 50)); archPane.setDividerSize(0); // Inner borders From 7cd43c55e13d2924d30c2a0303cf8453c7dacd06 Mon Sep 17 00:00:00 2001 From: Hernan Ponce de Leon Date: Fri, 12 Apr 2019 11:12:13 +0200 Subject: [PATCH 139/145] Armonized UI between Linux and MacOs --- ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java index 3bde36056d..c1e36e5a9f 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java +++ b/ui/src/main/java/com/dat3m/ui/editor/EditorsPane.java @@ -34,7 +34,7 @@ public EditorsPane(){ menuExporter.add(editors.get(EditorCode.TARGET_MM).getExporterItem()); Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension editorsDimension = new Dimension((int)(2 * screenDimension.getWidth() / 5), (int)screenDimension.getHeight()); + Dimension editorsDimension = new Dimension((int)(screenDimension.getWidth() *1/3), (int)screenDimension.getHeight()); editors.get(EditorCode.PROGRAM).setPreferredSize(editorsDimension); editors.get(EditorCode.TARGET_MM).setPreferredSize(editorsDimension); From 5bccd4deafbed54ddd29c06eab23cbf2d413cd10 Mon Sep 17 00:00:00 2001 From: ponce Date: Sat, 13 Apr 2019 10:27:24 +0200 Subject: [PATCH 140/145] Removed weird dot --- ui/src/main/java/com/dat3m/ui/options/OptionsPane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java index 4c1362e73b..5c237de44d 100644 --- a/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java +++ b/ui/src/main/java/com/dat3m/ui/options/OptionsPane.java @@ -164,6 +164,7 @@ private void mkGrid(){ JSplitPane graphPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); graphPane.setLeftComponent(graphButton); graphPane.setRightComponent(relsButton); + graphPane.setDividerSize(0); JComponent[] panes = { taskPane, archPane, modePane, aliasPane, boundPane, testButton, clearButton, graphPane, scrollConsole }; Iterator it = Arrays.asList(panes).iterator(); JComponent current = iconPane; From a1c73e415d3fd26c10830a8f101c7c552c6d9596 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 16 Apr 2019 17:48:27 +0300 Subject: [PATCH 141/145] Indentation --- .../com/dat3m/ui/editor/LineNumbersView.java | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java index 0796ca4fd8..74558dfa6e 100644 --- a/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java +++ b/ui/src/main/java/com/dat3m/ui/editor/LineNumbersView.java @@ -20,63 +20,63 @@ class LineNumbersView extends JComponent implements CaretListener, ActionListener { - private final JTextComponent editor; + private final JTextComponent editor; LineNumbersView(JTextComponent editor) { - this.editor = editor; - editor.addCaretListener(this); - Dimension size = new Dimension(28, editor.getHeight()); - setPreferredSize(size); - setSize(size); + this.editor = editor; + editor.addCaretListener(this); + Dimension size = new Dimension(28, editor.getHeight()); + setPreferredSize(size); + setSize(size); } @Override public void paintComponent(Graphics g) { - super.paintComponent(g); + super.paintComponent(g); - Rectangle clip = g.getClipBounds(); - int currentOffset = editor.viewToModel(new Point(0, clip.y)); - int endOffset = editor.viewToModel(new Point(0, clip.y + clip.height)); + Rectangle clip = g.getClipBounds(); + int currentOffset = editor.viewToModel(new Point(0, clip.y)); + int endOffset = editor.viewToModel(new Point(0, clip.y + clip.height)); - while (currentOffset <= endOffset) { - try { - // Computes the line number based on the offset - int lineNumber = editor.getDocument().getDefaultRootElement().getElementIndex(currentOffset) + 1; - // x position of the line number is fixed - int x = getInsets().left + 2; - // y position is different for each line number - int y = getOffsetY(currentOffset); - - g.setFont(new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize())); - g.setColor(isCurrentLine(currentOffset) ? Color.RED : Color.BLACK); - g.drawString(valueOf(lineNumber), x, y); - - // Update offset - currentOffset = getRowEnd(editor, currentOffset) + 1; - } catch (BadLocationException e) { - e.printStackTrace(); - } - } + while (currentOffset <= endOffset) { + try { + // Computes the line number based on the offset + int lineNumber = editor.getDocument().getDefaultRootElement().getElementIndex(currentOffset) + 1; + // x position of the line number is fixed + int x = getInsets().left + 2; + // y position is different for each line number + int y = getOffsetY(currentOffset); + + g.setFont(new Font(Font.MONOSPACED, Font.BOLD, editor.getFont().getSize())); + g.setColor(isCurrentLine(currentOffset) ? Color.RED : Color.BLACK); + g.drawString(valueOf(lineNumber), x, y); + + // Update offset + currentOffset = getRowEnd(editor, currentOffset) + 1; + } catch (BadLocationException e) { + e.printStackTrace(); + } + } } private int getOffsetY(int offset) throws BadLocationException { - int descent = editor.getFontMetrics(editor.getFont()).getDescent(); - Rectangle r = editor.modelToView(offset); - return r.y + r.height - descent; + int descent = editor.getFontMetrics(editor.getFont()).getDescent(); + Rectangle r = editor.modelToView(offset); + return r.y + r.height - descent; } private boolean isCurrentLine(int offset) { - Element root = editor.getDocument().getDefaultRootElement(); - return root.getElementIndex(offset) == root.getElementIndex(editor.getCaretPosition()); + Element root = editor.getDocument().getDefaultRootElement(); + return root.getElementIndex(offset) == root.getElementIndex(editor.getCaretPosition()); } @Override public void caretUpdate(CaretEvent e) { - repaint(); + repaint(); } - @Override - public void actionPerformed(ActionEvent e) { - repaint(); - } - } \ No newline at end of file + @Override + public void actionPerformed(ActionEvent e) { + repaint(); + } +} \ No newline at end of file From 58065c7ef90112beb689888dd0eb003869d35895 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 16 Apr 2019 17:53:15 +0300 Subject: [PATCH 142/145] Removed duplicated imports --- ui/src/main/java/com/dat3m/ui/Dat3M.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/src/main/java/com/dat3m/ui/Dat3M.java b/ui/src/main/java/com/dat3m/ui/Dat3M.java index e290131fff..bb5916df6d 100644 --- a/ui/src/main/java/com/dat3m/ui/Dat3M.java +++ b/ui/src/main/java/com/dat3m/ui/Dat3M.java @@ -27,8 +27,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import static com.dat3m.ui.editor.EditorCode.SOURCE_MM; -import static com.dat3m.ui.editor.EditorCode.TARGET_MM; import static com.dat3m.ui.utils.Utils.showError; import static javax.swing.BorderFactory.createEmptyBorder; import static javax.swing.UIManager.getDefaults; @@ -115,7 +113,7 @@ private void runTest(){ Editor programEditor = editorsPane.getEditor(EditorCode.PROGRAM); Program program = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); try { - Wmm targetModel = new ParserCat().parse(editorsPane.getEditor(TARGET_MM).getEditorPane().getText()); + Wmm targetModel = new ParserCat().parse(editorsPane.getEditor(EditorCode.TARGET_MM).getEditorPane().getText()); if(options.getTask() == Task.REACHABILITY){ testResult = new ReachabilityResult(program, targetModel, options); } else { @@ -125,7 +123,7 @@ private void runTest(){ return; } Program sourceProgram = new ProgramParser().parse(programEditor.getEditorPane().getText(), programEditor.getLoadedFormat()); - Wmm sourceModel = new ParserCat().parse(editorsPane.getEditor(SOURCE_MM).getEditorPane().getText()); + Wmm sourceModel = new ParserCat().parse(editorsPane.getEditor(EditorCode.SOURCE_MM).getEditorPane().getText()); testResult = new PortabilityResult(sourceProgram, program, sourceModel, targetModel, options); } catch (Exception e){ String msg = e.getMessage() == null? "Memory model cannot be parsed" : e.getMessage(); From 8a9c5699d0e062c8548973d9db394f623a40b1dc Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 16 Apr 2019 18:11:40 +0300 Subject: [PATCH 143/145] Using default error strategy in all parsers --- .../main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java | 2 -- .../java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java | 1 - .../dat3m/dartagnan/parsers/program/utils/AssertionHelper.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java index 1db6818934..0ec97dfe83 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/ParserCat.java @@ -29,8 +29,6 @@ private Wmm parse(CharStream charStream){ CommonTokenStream tokenStream = new CommonTokenStream(lexer); CatParser parser = new CatParser(tokenStream); - // TODO: Why error handler was removed? - // parser.setErrorHandler(new BailErrorStrategy()); parser.addErrorListener(new ParserErrorListener()); ParserRuleContext parserEntryPoint = parser.mcm(); return (Wmm) parserEntryPoint.accept(new VisitorBase()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 28b505385b..7a80079bdf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -17,7 +17,6 @@ public Program parse(CharStream charStream) { CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusCParser parser = new LitmusCParser(tokenStream); - parser.setErrorHandler(new BailErrorStrategy()); ProgramBuilder pb = new ProgramBuilder(); ParserRuleContext parserEntryPoint = parser.main(); VisitorLitmusC visitor = new VisitorLitmusC(pb); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AssertionHelper.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AssertionHelper.java index 06c338535a..ed22bbf6c8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AssertionHelper.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AssertionHelper.java @@ -13,7 +13,6 @@ public static AbstractAssert parseAssertionList(ProgramBuilder programBuilder, S LitmusAssertionsLexer lexer = new LitmusAssertionsLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusAssertionsParser parser = new LitmusAssertionsParser(tokenStream); - parser.setErrorHandler(new BailErrorStrategy()); ParserRuleContext parserEntryPoint = parser.assertionList(); return parserEntryPoint.accept(new VisitorLitmusAssertions(programBuilder)); } @@ -23,7 +22,6 @@ public static AbstractAssert parseAssertionFilter(ProgramBuilder programBuilder, LitmusAssertionsLexer lexer = new LitmusAssertionsLexer(charStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusAssertionsParser parser = new LitmusAssertionsParser(tokenStream); - parser.setErrorHandler(new BailErrorStrategy()); ParserRuleContext parserEntryPoint = parser.assertionFilter(); return parserEntryPoint.accept(new VisitorLitmusAssertions(programBuilder)); } From d5b77caa9c8c922fe8a2be50ea9d3afe5f0b6ab2 Mon Sep 17 00:00:00 2001 From: Natalia Gavrilenko Date: Tue, 16 Apr 2019 20:22:00 +0300 Subject: [PATCH 144/145] Set bail error strategy in C parser --- .../java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java index 7a80079bdf..28b505385b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ParserLitmusC.java @@ -17,6 +17,7 @@ public Program parse(CharStream charStream) { CommonTokenStream tokenStream = new CommonTokenStream(lexer); LitmusCParser parser = new LitmusCParser(tokenStream); + parser.setErrorHandler(new BailErrorStrategy()); ProgramBuilder pb = new ProgramBuilder(); ParserRuleContext parserEntryPoint = parser.main(); VisitorLitmusC visitor = new VisitorLitmusC(pb); From afc778eeb6839f3e917ab4802ab5aae30221f017 Mon Sep 17 00:00:00 2001 From: Zeta Date: Wed, 17 Apr 2019 16:10:08 +0200 Subject: [PATCH 145/145] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ef922fb3e4..2aa1b72f1f 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ They must be one of the following: **Note:** Option target is mandatory in DARTAGNAN when using the.pts format. Other optional arguments include: -- -m, --mode {knastertarski, idl, kleene}: specifies the encoding for fixed points. Knaster-tarski (default mode) uses the encoding introduced in [1]. Mode idl uses the Integer Difference Logic iteration encoding introduced in [2]. Kleene mode uses the Kleene iteration encoding using one Boolean variable for each iteration step. +- -m, --mode {knastertarski, idl, kleene}: specifies the encoding for fixed points. Knaster-tarski (default mode) uses the encoding introduced in [2]. Mode idl uses the Integer Difference Logic iteration encoding introduced in [3]. Kleene mode uses the Kleene iteration encoding using one Boolean variable for each iteration step. - -a, --alias {none, andersen, cfs}: specifies the alias-analysis used. Option andersen (the default one) uses a control-flow-insensitive method. Option cfs uses a control-flow-sensitive method. Option none performs no alias analysis. - -unroll: unrolling bound for the BMC. @@ -113,6 +113,9 @@ Dat3M is developed and maintained by [Hernán Ponce de León](mailto:ponce@forti References ====== -[1] Hernán Ponce de León, Florian Furbach, Keijo Heljanko, Roland Meyer: **BMC with Memory Models as Modules**. FMCAD 2018. +[1] Natalia Gavrilenko, Hernán Ponce de León, Florian Furbach, Keijo Heljanko, Roland Meyer: **BMC for Weak Memory Models: Relation Analysis for Compact SMT Encodings**. CAV 2019. + +[2] Hernán Ponce de León, Florian Furbach, Keijo Heljanko, Roland Meyer: **BMC with Memory Models as Modules**. FMCAD 2018. + +[3] Hernán Ponce de León, Florian Furbach, Keijo Heljanko, Roland Meyer: **Portability Analysis for Weak Memory Models. PORTHOS: One Tool for all Models**. SAS 2017. -[2] Hernán Ponce de León, Florian Furbach, Keijo Heljanko, Roland Meyer: **Portability Analysis for Weak Memory Models. PORTHOS: One Tool for all Models**. SAS 2017.

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