-
Rodrigo Cortes authoredRodrigo Cortes authored
JDialogSysCAMSExecutableCodeGeneration.java 55.57 KiB
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
*
* ludovic.apvrille AT enst.fr
*
* This software is a computer program whose purpose is to allow the
* edition of TURTLE analysis, design and deployment diagrams, to
* allow the generation of RT-LOTOS or Java code from this diagram,
* and at last to allow the analysis of formal validation traces
* obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
* from INRIA Rhone-Alpes.
*
* This software is governed by the CeCILL license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL license and that you accept its terms.
*/
package ui.window;
import syscamstranslator.toSysCAMS.MakefileCode;
import syscamstranslator.toSysCAMS.TopCellGenerator;
import syscamstranslator.toSysCAMSCluster.TopCellGeneratorCluster;
import launcher.LauncherException;
import launcher.RshClient;
import myutil.*;
import syscamstranslator.*;
import ui.util.IconManager;
import ui.MainGUI;
import ui.SysCAMSPanelTranslator;
import ui.syscams.SysCAMSComponentTaskDiagramPanel;
import org.apache.commons.math3.linear.*;
import org.apache.commons.math3.util.*;
import org.apache.commons.math3.fraction.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedList;
import java.util.Vector;
import java.util.Arrays;
/**
* Class JDialogSysCAMSExecutableCodeGeneration
* Dialog for managing the generation and compilation of SystemC-AMS executable code
* Creation: 23/05/2018
* @version 1.0 23/05/2018
* @author Irina Kit Yan LEE,
* @version 1.1 06/08/2018
* @author Rodrigo CORTES PORTO
*/
@SuppressWarnings("serial")
public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame implements ActionListener, Runnable, MasterProcessInterface {
protected Frame f;
protected MainGUI mgui;
private String textSysC1 = "Base directory of code generation:";
private String textSysC7 = "Base directory of topcell generation:";
private String textSysC8 = "Base directory of Makefile:";
// private String textSysC2 = "Compile SystemC-AMS executable with"; // compile
// private String textSysC4 = "Run code in soclib / mutekh:";
// private String textSysC5 = "Show AVATAR trace from file w/o hardware:";
// private String textSysC6 = "Show cycle accurate trace from MPSoC file:";
// private static String[] codes = {"AVATAR SOCLIB"};
// private static int selectedRun = 1;
// private static int selectedCompile = 0;
// private static int selectedViewTrace = 0;
// private static boolean static_putUserCode = true;
protected static String pathCode;
protected static String pathSoclibTraceFile;
protected static String pathCompileMPSoC;
protected static String pathExecuteMPSoC;
protected static boolean optimizeModeSelected = true;
protected final static int NOT_STARTED = 1;
protected final static int STARTED = 2;
protected final static int STOPPED = 3;
private static
int mode;
//components
protected JTextArea jta;
protected JButton start;
protected JButton stop;
protected JButton close;
protected JRadioButton exe, exeint, exetrace, exesoclib, compile, compilesoclib, viewtrace, viewtracesoclib;
protected ButtonGroup compilegroup, exegroup, viewgroup;
protected JLabel gen;
protected JTextField code1, code2, code3, compiler, exe1, exe2, exe3, exe4, exe2int, simulationTraceFile, simulationsoclibTraceFile;
protected JTabbedPane jp1;
protected JScrollPane jsp;
protected JCheckBox removeCFiles, removeXFiles, debugmode, tracemode, optimizemode, putUserCode;
protected JComboBox<String> versionCodeGenerator, units;
protected JButton showSimulationTrace, showOverflowStatus;
// private static int selectedUnit = 2;
// private static boolean removeCFilesValue = true;
// private static boolean removeXFilesValue = true;
// private static boolean debugValue = false;
// private static boolean tracingValue = false;
// private static boolean optimizeValue = true;
private Thread t;
private boolean go = false;
private boolean hasError = false;
protected boolean startProcess = false;
// private String hostExecute;
protected RshClient rshc;
public JDialogSysCAMSExecutableCodeGeneration(Frame _f, MainGUI _mgui, String title, String _pathCode) {
super(title);
f = _f;
mgui = _mgui;
if (pathCode == null) {
pathCode = _pathCode;
}
// if (pathCompileMPSoC == null) {
// pathCompileMPSoC = _pathCompileMPSoC;
// }
//
// if (pathExecuteMPSoC == null) {
// pathExecuteMPSoC = _pathExecuteMPSoC;
// }
//
// hostExecute = _hostExecute;
initComponents();
myInitComponents();
pack();
getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
protected void myInitComponents() {
mode = NOT_STARTED;
setButtons();
// makeSelectionCompile();
// makeSelectionExecute();
// makeSelectionViewTrace();
}
protected void initComponents() {
Container c = getContentPane();
setFont(new Font("Helvetica", Font.PLAIN, 14));
c.setLayout(new BorderLayout());
// Issue #41 Ordering of tabbed panes
jp1 = GraphicLib.createTabbedPane();//new JTabbedPane();
JPanel jp00 = new JPanel();
GridBagLayout gridbag00 = new GridBagLayout();
GridBagConstraints c00 = new GridBagConstraints();
jp00.setLayout(gridbag00);
jp00.setBorder(new javax.swing.border.TitledBorder("Validation"));
JPanel jp01 = new JPanel();
GridBagLayout gridbag01 = new GridBagLayout();
GridBagConstraints c01 = new GridBagConstraints();
jp01.setLayout(gridbag01);
jp01.setBorder(new javax.swing.border.TitledBorder("Code generation"));
// Panel 00 -> Validation
c00.gridheight = 1;
c00.weighty = 1.0;
c00.weightx = 1.0;
c00.gridwidth = GridBagConstraints.REMAINDER; //end row
c00.fill = GridBagConstraints.BOTH;
c00.gridheight = 1;
jp00.add(new JLabel(" "), c00);
c00.gridwidth = GridBagConstraints.REMAINDER; //end row
jp1.add("Validation", jp00);
// Panel 01 -> Code Generation
c01.gridheight = 1;
c01.weighty = 1.0;
c01.weightx = 1.0;
c01.gridwidth = GridBagConstraints.REMAINDER; //end row
c01.fill = GridBagConstraints.BOTH;
c01.gridheight = 1;
gen = new JLabel(textSysC1);
jp01.add(gen, c01);
code1 = new JTextField(pathCode, 100);
jp01.add(code1, c01);
gen = new JLabel(textSysC7);
jp01.add(gen, c01);
code2 = new JTextField(pathCode, 100);
jp01.add(code2, c01);
gen = new JLabel(textSysC8);
jp01.add(gen, c01);
code3 = new JTextField(pathCode, 100);
jp01.add(code3, c01);
jp01.add(new JLabel(" "), c01);
//c01.gridwidth = GridBagConstraints.REMAINDER; //end row
// removeCFiles = new JCheckBox("Remove .c / .h files");
// removeCFiles.setSelected(removeCFilesValue);
// jp01.add(removeCFiles, c01);
// removeXFiles = new JCheckBox("Remove .x files");
// removeXFiles.setSelected(removeXFilesValue);
// jp01.add(removeXFiles, c01);
// debugmode = new JCheckBox("Put debug information in generated code");
// debugmode.setSelected(debugValue);
// jp01.add(debugmode, c01);
//
// tracemode = new JCheckBox("Put tracing capabilities in generated code");
// tracemode.setSelected(tracingValue);
// jp01.add(tracemode, c01);
//
// optimizemode = new JCheckBox("Optimize code");
// optimizemode.setSelected(optimizeModeSelected);
// jp01.add(optimizemode, c01);
//
// putUserCode = new JCheckBox("Include user code");
// putUserCode.setSelected(static_putUserCode);
// jp01.add(putUserCode, c01);
// jp01.add(new JLabel("1 time unit ="), c01);
//
// units = new JComboBox<String>(unitTab);
// units.setSelectedIndex(selectedUnit);
// units.addActionListener(this);
// jp01.add(units, c01);
// jp01.add(new JLabel("Code generator used:"), c01);
// versionCodeGenerator = new JComboBox<String>(codes);
// versionCodeGenerator.setSelectedIndex(selectedItem);
// versionCodeGenerator.addActionListener(this);
// jp01.add(versionCodeGenerator, c01);
jp01.add(new JLabel(" "), c01);
jp1.add("Generate code", jp01);
// Panel 02 -> compile
// c02.gridheight = 1;
// c02.weighty = 1.0;
// c02.weightx = 1.0;
// c02.gridwidth = GridBagConstraints.REMAINDER; //end row
// c02.fill = GridBagConstraints.BOTH;
// c02.gridheight = 1;
// compilegroup = new ButtonGroup();
//
// compilesoclib = new JRadioButton(textSysC2, false);
// compilesoclib.addActionListener(this);
// jp02.add(compilesoclib, c02);
// compilegroup.add(compilesoclib);
// compiler = new JTextField(pathCompileMPSoC, 100);
// jp02.add(compiler, c02);
//compile.setSelected(selectedCompile == 0);
// compilesoclib.setSelected(selectedCompile == 1);
//
// jp1.add("Compile", jp02);
// Panel 03 -> Execute
// c03.gridheight = 1;
// c03.weighty = 1.0;
// c03.weightx = 1.0;
// c03.gridwidth = GridBagConstraints.REMAINDER; //end row
// c03.fill = GridBagConstraints.BOTH;
// c03.gridheight = 1;
// exegroup = new ButtonGroup();
/*exetrace = new JRadioButton(textSysC3, false);
exetrace.addActionListener(this);
exegroup.add(exetrace);
jp03.add(exetrace, c03);
exe3 = new JTextField(pathExecuteMPSoC+"-trace", 100);
jp03.add(exe3, c03);*/
//
// exesoclib = new JRadioButton(textSysC4, false);
// exesoclib.addActionListener(this);
// exegroup.add(exesoclib);
// jp03.add(exesoclib, c03);
// exe4 = new JTextField(pathExecuteMPSoC, 100);
// jp03.add(exe4, c03);
//exe.setSelected(selectedRun == 0);
//exetrace.setSelected(selectedRun == 1);
// exesoclib.setSelected(selectedRun == 2);
// jp03.add(new JLabel(" "), c03);
// jp1.add("Execute", jp03);
// Panel 04 -> View trace
// c04.gridheight = 1;
// c04.weighty = 1.0;
// c04.weightx = 1.0;
// c04.gridwidth = GridBagConstraints.REMAINDER; //end row
// c04.fill = GridBagConstraints.HORIZONTAL;
// c04.gridheight = 1;
// viewgroup = new ButtonGroup();
// viewtrace = new JRadioButton(textSysC5, false);
// viewgroup.add(viewtrace);
// viewtrace.addActionListener(this);
// jp04.add(viewtrace, c04);
// simulationTraceFile = new JTextField(pathCode + "trace.txt", 100);
// jp04.add(simulationTraceFile, c04);
// viewtracesoclib = new JRadioButton(textSysC6, false);
// viewgroup.add(viewtracesoclib);
// viewtracesoclib.addActionListener(this);
// jp04.add(viewtracesoclib, c04);
// simulationsoclibTraceFile = new JTextField(pathSoclibTraceFile, 100);
// jp04.add(simulationsoclibTraceFile, c04);
//
// showSimulationTrace = new JButton("Show simulation trace");
// showSimulationTrace.addActionListener(this);
// jp04.add(showSimulationTrace, c04);
//-------------Ajout C.Demarigny---------------
// showOverflowStatus = new JButton("Show overflow status");
// showOverflowStatus.addActionListener(this);
// jp04.add(showOverflowStatus, c04);
//----------------Fin ajout--------------------
// viewtrace.setSelected(selectedViewTrace == 0);
// viewtracesoclib.setSelected(selectedViewTrace == 1);
// jp1.add("Results", jp04);
c.add(jp1, BorderLayout.NORTH);
jta = new ScrolledJTextArea();
jta.setEditable(false);
jta.setMargin(new Insets(10, 10, 10, 10));
jta.setTabSize(3);
jta.append("Select options and then, click on 'start' to launch validation / code generation\n"); // / compilation / execution
Font f = new Font("Courrier", Font.BOLD, 12);
jta.setFont(f);
jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
c.add(jsp, BorderLayout.CENTER);
start = new JButton("Start", IconManager.imgic53);
stop = new JButton("Stop", IconManager.imgic55);
close = new JButton("Close", IconManager.imgic27);
start.setPreferredSize(new Dimension(100, 30));
stop.setPreferredSize(new Dimension(100, 30));
close.setPreferredSize(new Dimension(100, 30));
start.addActionListener(this);
stop.addActionListener(this);
close.addActionListener(this);
JPanel jp2 = new JPanel();
jp2.add(start);
jp2.add(stop);
jp2.add(close);
c.add(jp2, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent evt) {
String command = evt.getActionCommand();
// Compare the action command to the known actions.
if (command.equals("Start")) {
startProcess();
} else if (command.equals("Stop")) {
stopProcess();
} else if (command.equals("Close")) {
closeDialog();
} else if (evt.getSource() == versionCodeGenerator) {
// selectedItem = versionCodeGenerator.getSelectedIndex();
// } else if (evt.getSource() == units) {
// selectedUnit = units.getSelectedIndex();
// } else if (evt.getSource() == showSimulationTrace) {
// showSimulationTrace();
//} else if ((evt.getSource() == exe) || (evt.getSource() == exetrace)|| (evt.getSource() == exesoclib)) {
// else if ((evt.getSource() == exetrace) || (evt.getSource() == exesoclib)) {
// makeSelectionExecute();
// // } else if ((evt.getSource() == compile) || (evt.getSource() == compilesoclib)) {
// } else if ((evt.getSource() == compilesoclib)) {
// makeSelectionCompile();
// } else if ((evt.getSource() == viewtrace) || (evt.getSource() == viewtracesoclib)) {
// makeSelectionViewTrace();
// } else if ((evt.getSource() == showOverflowStatus)) { //ajout CD
// showOverflowStatus();
}
}
public void closeDialog() {
if (mode == STARTED) {
stopProcess();
}
// optimizeModeSelected = optimizemode.isSelected();
// removeCFilesValue = removeCFiles.isSelected();
// removeXFilesValue = removeXFiles.isSelected();
// debugValue = debugmode.isSelected();
// tracingValue = tracemode.isSelected();
// static_putUserCode = putUserCode.isSelected();
dispose();
}
//
// public void makeSelectionExecute() {
//
// //if (exetrace.isSelected()) {
// // selectedRun = 1;
// //} else {
// selectedRun = 2;
// //}
//
// // exe2.setEnabled(selectedRun == 0);
// //exe3.setEnabled(selectedRun == 1);
// exe4.setEnabled(selectedRun == 2);
// }
// public void makeSelectionCompile() {
//
// selectedCompile = 1;
// compiler.setEnabled(selectedCompile == 1);
//
// }
// public void makeSelectionViewTrace() {
// if (viewtrace.isSelected()) {
// selectedViewTrace = 0;
// } else {
// selectedViewTrace = 1;
// }
// simulationTraceFile.setEnabled(selectedViewTrace == 0);
// // simulationsoclibTraceFile.setEnabled(selectedViewTrace == 1);
// }
public void stopProcess() {
try {
rshc.stopCommand();
} catch (LauncherException le) {
}
rshc = null;
mode = STOPPED;
setButtons();
go = false;
}
public void startProcess() {
startProcess = false;
t = new Thread(this);
mode = STARTED;
setButtons();
go = true;
t.start();
}
private void testGo() throws InterruptedException {
if (go == false) {
throw new InterruptedException("Stopped by user");
}
}
public void run() {
// String cmd;
// String list;//, data;
hasError = false;
try {
if (jp1.getSelectedIndex() == 0) {
Vector<SysCAMSComponentTaskDiagramPanel> syscamsDiagramPanels = mgui.getListSysCAMSPanel();
for (SysCAMSComponentTaskDiagramPanel syscamsDiagramPanel : syscamsDiagramPanels) {
SysCAMSPanelTranslator syscamspaneltranslator = new SysCAMSPanelTranslator(syscamsDiagramPanel);
SysCAMSSpecification syscalsspec = syscamspaneltranslator.getSysCAMSSpecification();
if (syscalsspec == null) {
jta.append("Error: No SYSCAMS specification\n");
} else {
jta.append("\nPerforming Validation for \""+(syscalsspec.getCluster()).getClusterName()+"\".\n");
LinkedList<SysCAMSTConnector> connectors = syscalsspec.getAllConnectorsCluster4Matrix();
System.out.printf("Connectors4matrix for 1 cluster = %d.\n", connectors.size());
LinkedList<SysCAMSTBlockTDF> tdfBlocks = syscalsspec.getAllBlockTDF();
System.out.printf("Blocks for 1 cluster = %d.\n", tdfBlocks.size());
LinkedList<SysCAMSTConnector> connectorsTdfDe = syscalsspec.getAllConnectorsTdfDe();
System.out.printf("ConnectorsTdfDe for 1 cluster = %d.\n", connectorsTdfDe.size());
LinkedList<SysCAMSTConnector> allConnectors = syscalsspec.getAllConnectorsCluster4Soclib();
System.out.printf("All Connectors for 1 cluster = %d.\n", allConnectors.size());
LinkedList<SysCAMSTBlockDE> deBlocks = syscalsspec.getAllBlockDE();
LinkedList<SysCAMSTBlockGPIO2VCI> gpioBlocks = syscalsspec.getAllBlockGPIO2VCI();
//Validate that all ports are connected
try {
int nbPorts = 0;
for(SysCAMSTBlockTDF tdfBlock : tdfBlocks) {
nbPorts += tdfBlock.getPortTDF().size() + tdfBlock.getPortConverter().size();
}
for(SysCAMSTBlockDE deBlock : deBlocks) {
nbPorts += deBlock.getPortDE().size();
}
for(SysCAMSTBlockGPIO2VCI gpioBlock : gpioBlocks) {
nbPorts += gpioBlock.getPortDE().size();
}
if(nbPorts != (allConnectors.size()*2)) {
jta.append("Error: There are unconnected ports.\n");
throw new InterruptedException();
}
for(SysCAMSTBlockTDF tdfBlock : tdfBlocks) {
if(tdfBlock.getPeriod() < 0) {
tdfBlock.setPeriod(0);
}
for(SysCAMSTPortTDF portTdf : tdfBlock.getPortTDF()) {
if(portTdf.getPeriod() < 0) {
portTdf.setPeriod(0);
}
if(portTdf.getRate() < 0) {
portTdf.setRate(1);
}
if(portTdf.getDelay() < 0) {
portTdf.setDelay(0);
}
}
for(SysCAMSTPortConverter portConverter : tdfBlock.getPortConverter()) {
if(portConverter.getPeriod() < 0) {
portConverter.setPeriod(0);
}
if(portConverter.getRate() < 0) {
portConverter.setRate(1);
}
if(portConverter.getDelay() < 0) {
portConverter.setDelay(0);
}
}
}
//Validate Block parameters (rate, Tp, Tm, Delay) and propagate timesteps to all blocks
//try {
propagateTimestep(connectorsTdfDe, tdfBlocks);
//TODO-DELETE THIS, after debugging:
for(SysCAMSTBlockTDF tdfBlock : tdfBlocks) {
System.out.println("params of Block: " +tdfBlock.getName());
System.out.println("Tm: " + tdfBlock.getPeriod());
for(SysCAMSTPortTDF portTdf : tdfBlock.getPortTDF()) {
System.out.println("Port: " + portTdf.getName());
System.out.println("Tp: " + portTdf.getPeriod());
System.out.println("Rate: " + portTdf.getRate());
System.out.println("Delay: " + portTdf.getDelay());
}
for(SysCAMSTPortConverter portConverter : tdfBlock.getPortConverter()) {
System.out.println("Port: " + portConverter.getName());
System.out.println("Tp: " + portConverter.getPeriod());
System.out.println("Rate: " + portConverter.getRate());
System.out.println("Delay: " + portConverter.getDelay());
}
}
//TODO: verify trivial case when only 1 block and no connectors.
if(connectors.size() > 0) {
boolean recompute = false;
boolean suggest_delays = false;
RealVector buffer = new ArrayRealVector(connectors.size());
RealVectorFormat printFormat = new RealVectorFormat();
RealMatrix topologyMatrix = buildTopologyMatrix(connectors, tdfBlocks, buffer);
System.out.println("Buffer after topMatrix is: " + printFormat.format(buffer) );
//try {
RealVector execRate = solveTopologyMatrix(topologyMatrix, tdfBlocks);
//TODO: to recompute missing delays in loops: modify buffer with the suggested delay, and loop.
do {
recompute = computeSchedule(execRate, topologyMatrix, buffer, tdfBlocks, connectors);
if(recompute)
suggest_delays = true;
} while (recompute);
if(suggest_delays){
jta.append("The following delays are suggested to solve synchronization issues between DE and TDF modules:\n");
for(SysCAMSTBlockTDF tdfBlock : tdfBlocks){
for(SysCAMSTPortConverter portConverter : tdfBlock.getPortConverter()) {
if(portConverter.getRecompute()){
jta.append("In Block: \"" + tdfBlock.getName() + "\". Port: \"" + portConverter.getName() + "\". Insert delay of " + portConverter.getDelay() + "\n");
}
}
}
}
}
jta.append("Validation for \""+(syscalsspec.getCluster()).getClusterName()+"\" completed.\n");
} catch (InterruptedException ie) {
System.err.println("Interrupted");
jta.append("Interrupted\n");
mode = STOPPED;
setButtons();
hasError = true;
//return;
} catch (Exception e) {
e.printStackTrace();
mode = STOPPED;
setButtons();
hasError = true;
return;
}
}
}
}
testGo();
if (jp1.getSelectedIndex() == 1) {
jta.append("Generating executable code (SystemC-AMS version)\n");
Vector<SysCAMSComponentTaskDiagramPanel> syscamsDiagramPanels = mgui.getListSysCAMSPanel();
LinkedList<SysCAMSTCluster> clusters = new LinkedList<SysCAMSTCluster>();
for (SysCAMSComponentTaskDiagramPanel syscamsDiagramPanel : syscamsDiagramPanels) {
SysCAMSPanelTranslator syscamspaneltranslator = new SysCAMSPanelTranslator(syscamsDiagramPanel);
SysCAMSSpecification syscalsspec = syscamspaneltranslator.getSysCAMSSpecification();
clusters.add(syscalsspec.getCluster());
}
for (SysCAMSComponentTaskDiagramPanel syscamsDiagramPanel : syscamsDiagramPanels) {
SysCAMSPanelTranslator syscamspaneltranslator = new SysCAMSPanelTranslator(syscamsDiagramPanel);
SysCAMSSpecification syscalsspec = syscamspaneltranslator.getSysCAMSSpecification();
// Generating code
if (syscalsspec == null) {
jta.append("Error: No SYSCAMS specification\n");
} else {
System.err.println("**SYSCAMS TOPCELL found");
TopCellGenerator topCellGenerator = new TopCellGenerator(syscalsspec);
TopCellGeneratorCluster topCellGeneratorCluster = new TopCellGeneratorCluster(syscalsspec);
testGo();
jta.append("Generation of TopCell \"" + syscalsspec.getCluster().getClusterName() + "\" executable code: done\n");
try {
jta.append("Saving SysCAMS code in files\n");
System.err.println("Saving SysCAMS code in files\n");
pathCode = code2.getText();
System.err.println("SYSCAMS TOPCELL : " + syscalsspec.getCluster().getClusterName() + "saved in " + code2.getText());
topCellGenerator.saveFile(pathCode);
topCellGeneratorCluster.saveFile(pathCode);
jta.append("Code saved\n");
} catch (Exception e) {
jta.append("Could not generate files\n");
System.err.println("Could not generate SysCAMS files\n");
e.printStackTrace();
}
}
testGo();
}
try {
String makefile;
System.err.println(pathCode + "Makefile");
FileWriter fw = new FileWriter(pathCode + "/" + "Makefile");
makefile = MakefileCode.getMakefileCode(clusters);
fw.write(makefile);
fw.close();
} catch (Exception ex) {
ex.printStackTrace();
}
testGo();
}
// if (removeCFiles.isSelected()) {
//
// jta.append("Removing all .h files\n");
//
// list = FileUtils.deleteFiles(code1.getText() + TasksAndMainGenerator.getGeneratedPath(), ".h");
// if (list.length() == 0) {
// jta.append("No files were deleted\n");
// } else {
// jta.append("Files deleted:\n" + list + "\n");
// }
// jta.append("Removing all .c files\n");
// list = FileUtils.deleteFiles(code1.getText() + TasksAndMainGenerator.getGeneratedPath(), ".c");
// if (list.length() == 0) {
// jta.append("No files were deleted\n");
// } else {
// jta.append("Files deleted:\n" + list + "\n");
// }
// }
// if (removeXFiles.isSelected()) {
// jta.append("Removing all .x files\n");
// list = FileUtils.deleteFiles(code1.getText(), ".x");
// if (list.length() == 0) {
// jta.append("No files were deleted\n");
// } else {
// jta.append("Files deleted:\n" + list + "\n");
// }
// }
// testGo();
// selectedUnit = units.getSelectedIndex();
// Generating code
// if (avspec == null) {
// jta.append("Error: No AVATAR specification\n");
// } else {
//
// TasksAndMainGenerator gene = new TasksAndMainGenerator(syscalsspec, avspec);
// gene.includeUserCode(putUserCode.isSelected());
// gene.setTimeUnit(selectedUnit);
// gene.generateSoclib(debugmode.isSelected(), tracemode.isSelected());
//
// if (syscalsspec == null) {
// jta.append("Error: No AVATAR Deployment specification\n");
// } else {
// System.err.println("AVATAR TOPCELL found");
// }
//
// TopCellGenerator topCellGenerator = new TopCellGenerator(syscalsspec, tracemode.isSelected(), avspec);
// testGo();
// jta.append("Generation of TopCell executable code: done\n");
//
// try {
// jta.append("Saving code in files\n");
// pathCode = code2.getText();
// topCellGenerator.saveFile(pathCode);
//
// jta.append("Code saved\n");
// } catch (Exception e) {
// jta.append("Could not generate files\n");
// }
//
// testGo();
// jta.append("Generation of C-SOCLIB executable code: done\n");
// try {
// jta.append("Saving code in files\n");
// pathCode = code1.getText();
// gene.saveInFiles(pathCode);
//
// jta.append("Code saved\n");
// } catch (Exception e) {
// jta.append("Could not generate files\n");
// }
// }
// }
// testGo();
// if (jp1.getSelectedIndex() == 1) {
// cmd = compiler.getText();
// jta.append("Compiling executable code with command: \n" + cmd + "\n");
//
// rshc = new RshClient(hostExecute);
// try {
// processCmd(cmd, jta);
// jta.append("Compilation done\n");
// } catch (LauncherException le) {
// jta.append("Error: " + le.getMessage() + "\n");
// mode = STOPPED;
// setButtons();
// return;
// } catch (Exception e) {
// mode = STOPPED;
// setButtons();
// return;
// }
// }
//
// if (jp1.getSelectedIndex() == 2) {
// try {
// cmd = exe4.getText();
// jta.append("Executing code with command: \n" + cmd + "\n");
// rshc = new RshClient(hostExecute);
// processCmd(cmd, jta);
// jta.append("Execution done\n");
// } catch (LauncherException le) {
// jta.append("Error: " + le.getMessage() + "\n");
// mode = STOPPED;
// setButtons();
// return;
// } catch (Exception e) {
// mode = STOPPED;
// setButtons();
// return;
// }
// }
if ((hasError == false) && (jp1.getSelectedIndex() < 1)) {
jp1.setSelectedIndex(jp1.getSelectedIndex() + 1);
}
} catch (InterruptedException ie) {
jta.append("Interrupted\n");
}
if (!hasError) {
jta.append("\n\nReady to process next command\n");
checkMode();
setButtons();
}
}
protected void processCmd(String cmd, JTextArea _jta) throws LauncherException {
rshc.setCmd(cmd);
rshc.sendExecuteCommandRequest();
final Writer output = new StringWriter();
rshc.writeCommandMessages(output);
_jta.append(output.toString());
return;
}
protected void checkMode() {
mode = NOT_STARTED;
}
protected void setButtons() {
switch (mode) {
case NOT_STARTED:
start.setEnabled(true);
stop.setEnabled(false);
close.setEnabled(true);
getGlassPane().setVisible(false);
break;
case STARTED:
start.setEnabled(false);
stop.setEnabled(true);
close.setEnabled(false);
getGlassPane().setVisible(true);
break;
case STOPPED:
default:
start.setEnabled(false);
stop.setEnabled(false);
close.setEnabled(true);
getGlassPane().setVisible(false);
break;
}
}
public boolean hasToContinue() {
return (go == true);
}
public void appendOut(String s) {
jta.append(s);
}
public void setError() {
// hasError = true;
}
public void propagateTimestep(LinkedList<SysCAMSTConnector> connectors, LinkedList<SysCAMSTBlockTDF> tdfBlocks) throws InterruptedException {
for(SysCAMSTBlockTDF tdfBlock : tdfBlocks) {
if(tdfBlock.getPeriod() > 0){
if(!propagateTm(tdfBlock, connectors)){
throw new InterruptedException();
}
return;
}
else {
for(SysCAMSTPortTDF tdfPort : tdfBlock.getPortTDF()) {
if(tdfPort.getPeriod() > 0){
if (!propagateTpTdf(tdfBlock, tdfPort, connectors)) {
throw new InterruptedException();
}
return;
}
}
for(SysCAMSTPortConverter converterPort : tdfBlock.getPortConverter()) {
if(converterPort.getPeriod() > 0){
if(!propagateTpConverter(tdfBlock, converterPort, connectors)) {
throw new InterruptedException();
}
return;
}
}
}
}
jta.append("Error: At least one Module or Port Timestep should be entered in at least one TDF block of this cluster.\n");
throw new InterruptedException();
}
public boolean propagateTm(SysCAMSTBlockTDF tdfBlock, LinkedList<SysCAMSTConnector> connectors) {
/* * 1. Get period Tm of tdfBlock
* for each port (TDF and converter)
* if Tp > 0
* validate timestep consistency against Tm.
* else: set Tp //(setPeriod of port - calcuating it).
* if it has TDF connected blocks
* if Tp of connected block <= 0 (unvisited)
* set Tp of connected port block
* propagateTp(nextTdfBlock);
* else //(Tp of connected block > 0)
* validate timestep consitency between 2 ports.
* if connected block is unvisted
* propagateTp(nextTdfBlock);
* return
* */
double tm = tdfBlock.getPeriod();
double tp;
int rate;
//Mark this tdf block as visited.
tdfBlock.setIsTimestepPropagated();
SysCAMSTPortTDF p1_tdfPort, p2_tdfPort;
for(SysCAMSTPortTDF tdfPort : tdfBlock.getPortTDF()) {
tp = tdfPort.getPeriod();
rate = tdfPort.getRate();
if(tp > 0) {
//validate timestep consistency (rate*tp == tm)
if(rate*tp != tm){
jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + tdfPort.getName()+"\".\n");
return false;
}
} else {
tp = tm/rate;
tdfPort.setPeriod((int)tp);
}
for(SysCAMSTConnector connector : connectors){
//if p1 belongs to portTDF, it implies p2 belongs as well.
if (connector.get_p1().getComponent() instanceof SysCAMSTPortTDF) {
p1_tdfPort = ((SysCAMSTPortTDF) connector.get_p1().getComponent());
p2_tdfPort = ((SysCAMSTPortTDF) connector.get_p2().getComponent());
if(p1_tdfPort.getName().equals(tdfPort.getName()) && p1_tdfPort.getBlockTDF().getName().equals(tdfBlock.getName())) {
if(p2_tdfPort.getPeriod() <= 0) {
p2_tdfPort.setPeriod(tp);
if(!propagateTpTdf(p2_tdfPort.getBlockTDF(), p2_tdfPort, connectors)) {
return false;
}
} else {
//validate timestep consitency between 2 ports.
if(p2_tdfPort.getPeriod() != tp) {
jta.append("Error: In block \""+tdfBlock.getName()+"\" Timestep Tp of port \"" +tdfPort.getName()
+ "\" is inconsistent with timestep Tp of port \"" + p2_tdfPort.getName()+"\" from block \""+p2_tdfPort.getBlockTDF().getName()+"\".\n");
return false;
}
//if connected block was not visited yet, then propagate timestep
if(!p2_tdfPort.getBlockTDF().getIsTimestepPropagated()) {
if(!propagateTpTdf(p2_tdfPort.getBlockTDF(), p2_tdfPort, connectors)) {
return false;
}
}
}
} else if(p2_tdfPort.getName().equals(tdfPort.getName()) && p2_tdfPort.getBlockTDF().getName().equals(tdfBlock.getName())) {
if(p1_tdfPort.getPeriod() <= 0) {
p1_tdfPort.setPeriod(tp);
if(!propagateTpTdf(p1_tdfPort.getBlockTDF(), p1_tdfPort, connectors)) {
return false;
}
} else {
//validate timestep consitency between 2 ports.
if(p1_tdfPort.getPeriod() != tp) {
jta.append("Error: In block \""+tdfBlock.getName()+"\" Timestep Tp of port \"" +tdfPort.getName()
+ "\" is inconsistent with timestep Tp of port \"" + p1_tdfPort.getName()+"\" from block \""+p1_tdfPort.getBlockTDF().getName()+"\".\n");
return false;
}
//if connected block was not visited yet, then propagate timestep
if(!p1_tdfPort.getBlockTDF().getIsTimestepPropagated()) {
if(!propagateTpTdf(p1_tdfPort.getBlockTDF(), p1_tdfPort, connectors)) {
return false;
}
}
}
}
}
}
}
for(SysCAMSTPortConverter converterPort : tdfBlock.getPortConverter()) {
tp = converterPort.getPeriod();
rate = converterPort.getRate();
if(tp > 0) {
//validate timestep consistency (rate*tp == tm)
if(rate*tp != tm){
jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + converterPort.getName()+"\".\n");
return false;
}
} else {
tp = tm/rate;
converterPort.setPeriod(tp);
}
}
return true;
}
public boolean propagateTpTdf(SysCAMSTBlockTDF tdfBlock, SysCAMSTPortTDF tdfPort, LinkedList<SysCAMSTConnector> connectors) {
/* 1. Get period Tp of tdfPort
* if current Tm > 0,
* validate against Tp of tdfPort.
* else: set Tm //(setPeriod of tdfBlock)
* 2. propagateTm(tdfBlock);
* return
*
* */
double tm = tdfBlock.getPeriod();
double tp = tdfPort.getPeriod();
int rate = tdfPort.getRate();
if(tm > 0) {
if(rate*tp != tm) {
jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + tdfPort.getName()+"\".\n");
return false;
}
} else {
tm = rate*tp;
tdfBlock.setPeriod(tm);
}
propagateTm(tdfBlock, connectors);
return true;
}
public boolean propagateTpConverter(SysCAMSTBlockTDF tdfBlock, SysCAMSTPortConverter converterPort, LinkedList<SysCAMSTConnector> connectors) {
double tm = tdfBlock.getPeriod();
double tp = converterPort.getPeriod();
int rate = converterPort.getRate();
if(tm > 0) {
if(rate*tp != tm) {
jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + converterPort.getName()+"\".\n");
return false;
}
} else {
tm = rate*tp;
tdfBlock.setPeriod(tm);
}
propagateTm(tdfBlock, connectors);
return true;
}
public RealMatrix buildTopologyMatrix(LinkedList<SysCAMSTConnector> connectors, LinkedList<SysCAMSTBlockTDF> blocks, RealVector buffer) {
double [][] tArray = new double[connectors.size()][blocks.size()];
for(int i = 0; i < connectors.size(); i++) {
for(int j = 0; j < blocks.size(); j++) {
if( ((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getBlockTDF().getName().equals(blocks.get(j).getName()) ) {
System.out.println("Inserting in : "+ i + " " + j + " From port: "+ ((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getName() +" Rate: " + ((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getRate() );
tArray[i][j] = ((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getRate();
if(((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getDelay() > 0) {
buffer.addToEntry(i, ((SysCAMSTPortTDF) connectors.get(i).get_p1().getComponent()).getDelay() );
}
} else if( ((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getBlockTDF().getName().equals(blocks.get(j).getName()) ) {
System.out.println("Inserting in : "+ i + " " + j + " From port: "+ ((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getName() +" Rate: " + -((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getRate() );
tArray[i][j] = -((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getRate();
if(((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getDelay() > 0) {
buffer.addToEntry(i, ((SysCAMSTPortTDF) connectors.get(i).get_p2().getComponent()).getDelay() );
}
}
}
}
//double[][] tArray = { { 2, -1, 0 }, { 0, 2, -4 }, { -1, 0, 1 } };
//double[][] tArray = { { 2, 3, 5 }, { -4, 2, 3} };
//double[][] tArray = { { 3, -2, 0, 0 }, { 0, 4, 0, -3 }, { 0, 1, -3, 0 }, { -1, 0, 2, 0 }, { -2, 0, 0, 1 } };
//double[][] tArray = { { 3, -2 } };
RealMatrix tMatrix = new Array2DRowRealMatrix(tArray);
return tMatrix;
}
public RealVector solveTopologyMatrix(RealMatrix matrixA, LinkedList<SysCAMSTBlockTDF> blocks) throws InterruptedException {
double dropThreshold = 1e-7;
//Using QR decomposition, A^TP=QR. Since rank MUST be rank = s-1
//(where s is number of blocks), then the last column of Q provides a basis for the kernel of A.
RRQRDecomposition qr = new RRQRDecomposition(matrixA.transpose());
RealMatrix qMatrix = qr.getQ();
int rank = qr.getRank(dropThreshold);
if(rank != blocks.size()-1){
jta.append("Error: Port sample rates are inconsistent. Topology matrix can not be solved.\n");
System.err.println("Port sample rates are inconsistent. Topology matrix can not be solved. Rank: " +rank+" != #blocks-1");
throw new InterruptedException();
}
System.out.println("Checking kernel columns ...");
RealMatrix zMatrix = matrixA.multiply(qMatrix);
for (int c = rank; c < matrixA.getColumnDimension(); c++) {
System.out.printf("The product of A with column %d of Q has sup "
+ "norm %f.\n",
c, zMatrix.getColumnMatrix(c).getNorm());
//TODO: verify if norm is not zero, throw error that kernel could not be found.
}
RealMatrix kernelMatrix = qMatrix.getSubMatrix( 0, qMatrix.getRowDimension()-1, rank, qMatrix.getColumnDimension()-1 );
double[] resultArray = new double[kernelMatrix.getRowDimension()];
double result_tmp = 0.0;
int v_lcm = 1;
BigFraction[] resultFractionArray = new BigFraction[kernelMatrix.getRowDimension()];
for (int i = 0; i < kernelMatrix.getRowDimension(); i++) {
System.out.printf("The kernelMatrix is %f .\n", kernelMatrix.getEntry(i, 0) );
resultArray[i] = kernelMatrix.getEntry(i, 0) / kernelMatrix.getEntry(kernelMatrix.getRowDimension()-1, 0);
result_tmp = kernelMatrix.getEntry(i, 0) / kernelMatrix.getEntry(kernelMatrix.getRowDimension()-1, 0);
resultFractionArray[i] = new BigFraction(result_tmp, 2147483647);
System.out.println("The resultArray is: "+ resultArray[i] + ", result_tmp: " + result_tmp);
System.out.println("The resultFractionArray is: "+ resultFractionArray[i].toString() + " with num: " + resultFractionArray[i].getNumeratorAsInt() + " and denom: "+ resultFractionArray[i].getDenominatorAsInt()
+ " and given as a double: " + resultFractionArray[i].doubleValue());
v_lcm = ArithmeticUtils.lcm(resultFractionArray[i].getDenominatorAsInt() , v_lcm);
System.out.println("The lcm is: "+ v_lcm );
}
int[] tmpResult = new int[kernelMatrix.getRowDimension()];
double[] finalResult = new double[kernelMatrix.getRowDimension()];
for (int i = 0; i < kernelMatrix.getRowDimension(); i++) {
tmpResult[i] = (resultFractionArray[i].multiply(v_lcm)).intValue();
finalResult[i] = (double)tmpResult[i];
System.out.println("The finalResult is: "+ finalResult[i] + " - " + blocks.get(i).getName() );
}
RealVector xVector = new ArrayRealVector(finalResult);
return xVector;
}
public boolean computeSchedule(RealVector q, RealMatrix gamma, RealVector buffer, LinkedList<SysCAMSTBlockTDF> tdfBlocks, LinkedList<SysCAMSTConnector> connectors) throws InterruptedException {
RealVector q1 = new ArrayRealVector(q.getDimension());
RealVector nu = new ArrayRealVector(q.getDimension());
RealVector tmpBuffer = new ArrayRealVector(gamma.getRowDimension());;
RealVectorFormat printFormat = new RealVectorFormat();
boolean deadlock = false;
boolean recompute = false;
SysCAMSTBlockTDF tdfBlock;
LinkedList<SysCAMSTPortConverter> portConvertersTmp;
double[] time_prev = {0.0, 0.0}; //array to store "in" ([0]) and "out" ([1]) previous times
//Reset the number of times all blocks have been executed
for(int i = 0; i < tdfBlocks.size(); i++) {
tdfBlocks.get(i).setN(0);
}
try {
while (!(q1.equals(q)) && !deadlock){
deadlock = true;
for(int i = 0; i < tdfBlocks.size(); i++) {
tdfBlock = tdfBlocks.get(i);
//check if block is runnable: If it has not run q times
//and it won't cause a buffer size to go negative.
System.out.println("q1 is: " + printFormat.format(q1) );
System.out.println("q is: " + printFormat.format(q) );
if(q1.getEntry(i) != q.getEntry(i)) {
nu.setEntry(i, 1);
tmpBuffer = buffer.add(gamma.operate(nu));
System.out.println("tmpBuffer is: " + printFormat.format(tmpBuffer) );
if(tmpBuffer.getMinValue() >= 0) {
deadlock = false;
q1 = q1.add(nu);
buffer = tmpBuffer.copy();
System.out.println("Schedule " + tdfBlock.getName() );
System.out.println("Buffer is: " + printFormat.format(buffer) );
//Validate sync bewtween TDF/DE
tdfBlock.syncTDFBlockDEBlock(time_prev);
}
nu.setEntry(i, 0);
}
}
}
} catch (SysCAMSValidateException se) {
recompute = true;
System.out.println("Causality exception: " + se.getMessage());
}
if (deadlock){
System.out.println("Static schedule can not be computed due to missing delays in loops" );
jta.append("Error: Static schedule can not be computed due to missing delays in loops\n" );
int minIndex = tmpBuffer.getMinIndex();
//TODO: for the suggested delay, I need to first detect loops within the graph(DFS?), then recompute recursively with the suggested delay until it can be solved.
/*jta.append("Following delay is suggested:\n" );
int currentDelay = ((SysCAMSTPortTDF) connectors.get(minIndex).get_p2().getComponent()).getDelay();
jta.append(currentDelay-(int)tmpBuffer.getMinValue() +" in port \""
+((SysCAMSTPortTDF) connectors.get(minIndex).get_p2().getComponent()).getName()
+"\" from block \""+ ((SysCAMSTPortTDF) connectors.get(minIndex).get_p2().getComponent()).getBlockTDF().getName()+"\"\n");
*/
throw new InterruptedException();
} else {
System.out.println("Schedule complete-STOP" );
}
return recompute;
}
// public void showSimulationTrace() {
// JFrameSimulationSDPanel jfssdp = new JFrameSimulationSDPanel(f, mgui, "Simulation trace of " + simulationTraceFile.getText());
// jfssdp.setIconImage(IconManager.img8);
// GraphicLib.centerOnParent(jfssdp, 600, 600);
// if (selectedViewTrace == 0) {
// jfssdp.setFileReference(simulationTraceFile.getText());
// } else {
// jfssdp.setFileReference(simulationsoclibTraceFile.getText());
// }
// jfssdp.setVisible(true);
// TraceManager.addDev("Ok JFrame");
// }
// public void showOverflowStatus() {
// try {
// String path = ConfigurationTTool.AVATARMPSoCPerformanceEvaluationDirectory;
// String taille = "0";
//
// String log = "mwmr0.log";
//
// String[] commande = {"sh", path + "callingOverflow.sh", taille, path, log};
//
// ProcessBuilder pb = new ProcessBuilder(commande);
// pb.redirectError(ProcessBuilder.Redirect.INHERIT);
// Process p = pb.start();
//
// int exitStatus = p.waitFor();
//
// } catch (InterruptedException e) {
// e.printStackTrace();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
}