Commit 2ce74392 authored by Andrey Filippov's avatar Andrey Filippov

Added Vivado launching, some cleanup of the code

parent 9d3c3811
...@@ -17,68 +17,14 @@ ...@@ -17,68 +17,14 @@
package com.elphel.vdt.core.launching; package com.elphel.vdt.core.launching;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.debug.internal.ui.views.console.ProcessConsole;
//import org.eclipse.core.resources.IProject;
//import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IStreamListener;
//import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IProcess;
//import org.eclipse.debug.ui.DebugUITools;
//import org.eclipse.ui.console.ConsolePlugin;
//import org.eclipse.ui.console.IConsoleManager;
//import org.eclipse.ui.console.IPatternMatchListener;
//import org.eclipse.ui.console.MessageConsole;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.core.model.IStreamsProxy;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsole;
//import org.eclipse.debug.ui.console.IConsole;
import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.IOConsoleInputStream;
import org.eclipse.ui.console.IOConsoleOutputStream;
import com.elphel.vdt.Txt;
import com.elphel.vdt.core.tools.contexts.BuildParamsItem;
import com.elphel.vdt.ui.MessageUI;
//import com.elphel.vdt.VDTPlugin;
import com.elphel.vdt.veditor.VerilogPlugin; import com.elphel.vdt.veditor.VerilogPlugin;
import com.elphel.vdt.veditor.parser.OutlineContainer;
import com.elphel.vdt.veditor.preference.PreferenceStrings; import com.elphel.vdt.veditor.preference.PreferenceStrings;
//import com.elphel.vdt.core.Utils;
import org.eclipse.ui.console.IConsoleListener; import org.eclipse.ui.console.IConsoleListener;
public class RunningBuilds { public class RunningBuilds {
...@@ -87,19 +33,25 @@ public class RunningBuilds { ...@@ -87,19 +33,25 @@ public class RunningBuilds {
public RunningBuilds(){ public RunningBuilds(){
unfinishedBuilds = new ConcurrentHashMap<String, VDTRunnerConfiguration>(); unfinishedBuilds = new ConcurrentHashMap<String, VDTRunnerConfiguration>();
IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
// This is not used, just for testing // This is not used, just for testing
System.out.println("***Addded console listeners"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("***Addded console listeners");
}
manager.addConsoleListener(new IConsoleListener(){ manager.addConsoleListener(new IConsoleListener(){
public void consolesAdded(IConsole[] consoles){ public void consolesAdded(IConsole[] consoles){
for (int i=0;i<consoles.length;i++){ for (int i=0;i<consoles.length;i++){
System.out.println("+++ Added: "+consoles[i].getName()); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("+++ Added: "+consoles[i].getName());
}
// Only shows added consoles // Only shows added consoles
} }
} }
public void consolesRemoved(IConsole[] consoles){ public void consolesRemoved(IConsole[] consoles){
for (int i=0;i<consoles.length;i++){ for (int i=0;i<consoles.length;i++){
System.out.println("--- Removed: "+consoles[i].getName()); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
// unfinishedBuilds.remove(consoles[i]); System.out.println("--- Removed: "+consoles[i].getName());
}
// unfinishedBuilds.remove(consoles[i]);
removeConsole(consoles[i]); removeConsole(consoles[i]);
} }
} }
...@@ -108,16 +60,24 @@ public class RunningBuilds { ...@@ -108,16 +60,24 @@ public class RunningBuilds {
public String findConsoleParent(IConsole console){ public String findConsoleParent(IConsole console){
Iterator<String> iter=unfinishedBuilds.keySet().iterator(); Iterator<String> iter=unfinishedBuilds.keySet().iterator();
System.out.println("findConsoleParent("+console.getName()+")"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("findConsoleParent("+console.getName()+")");
}
while (iter.hasNext()) { while (iter.hasNext()) {
String consoleName=iter.next(); String consoleName=iter.next();
System.out.print("Got console name:"+consoleName); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.print("Got console name:"+consoleName);
}
VDTRunnerConfiguration runConfig=unfinishedBuilds.get(consoleName); VDTRunnerConfiguration runConfig=unfinishedBuilds.get(consoleName);
if (runConfig.hasConsole(console)){ if (runConfig.hasConsole(console)){
System.out.println(consoleName+" -> GOT IT"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println(consoleName+" -> GOT IT");
}
return consoleName; return consoleName;
} }
System.out.println(consoleName+" -> no luck"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println(consoleName+" -> no luck");
}
} }
return null; return null;
} }
...@@ -126,13 +86,19 @@ public class RunningBuilds { ...@@ -126,13 +86,19 @@ public class RunningBuilds {
if (consoleName!=null){ if (consoleName!=null){
VDTRunnerConfiguration runConfig=unfinishedBuilds.get(consoleName); VDTRunnerConfiguration runConfig=unfinishedBuilds.get(consoleName);
runConfig.removeConsole(console); runConfig.removeConsole(console);
System.out.println("Removing console "+console.getName()+" from runConfig for "+consoleName); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("Removing console "+console.getName()+" from runConfig for "+consoleName);
}
if (runConfig.noConsoles()){ if (runConfig.noConsoles()){
System.out.println("No consoles left in unfinished "+consoleName+" - removing it too"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("No consoles left in unfinished "+consoleName+" - removing it too");
}
unfinishedBuilds.remove(consoleName); unfinishedBuilds.remove(consoleName);
} }
} else { } else {
System.out.println("Console "+console.getName()+" did not belong here"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println("Console "+console.getName()+" did not belong here");
}
} }
} }
public boolean isUnfinished(IConsole console){ public boolean isUnfinished(IConsole console){
......
...@@ -42,6 +42,7 @@ import com.elphel.vdt.VDT; ...@@ -42,6 +42,7 @@ import com.elphel.vdt.VDT;
import com.elphel.vdt.VerilogUtils; import com.elphel.vdt.VerilogUtils;
// import com.elphel.vdt.VDTPlugin; // import com.elphel.vdt.VDTPlugin;
import com.elphel.vdt.veditor.VerilogPlugin; import com.elphel.vdt.veditor.VerilogPlugin;
import com.elphel.vdt.veditor.preference.PreferenceStrings;
import com.elphel.vdt.core.tools.ToolsCore; import com.elphel.vdt.core.tools.ToolsCore;
import com.elphel.vdt.core.tools.contexts.BuildParamsItem; import com.elphel.vdt.core.tools.contexts.BuildParamsItem;
import com.elphel.vdt.core.tools.params.Parameter; import com.elphel.vdt.core.tools.params.Parameter;
...@@ -64,13 +65,17 @@ public class VDTLaunchUtil { ...@@ -64,13 +65,17 @@ public class VDTLaunchUtil {
* Returns the VDT runner. * Returns the VDT runner.
*/ */
public static VDTRunner getRunner() { public static VDTRunner getRunner() {
if (toolRunner == null) { if (toolRunner == null) {
System.out.println ("Created new VDTRunner()"); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
toolRunner = new VDTRunner(); System.out.println ("Created new VDTRunner()");
} else { }
System.out.println ("Reused old VDTRunner()"); toolRunner = new VDTRunner();
} } else {
return toolRunner; if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)) {
System.out.println ("Reused old VDTRunner()");
}
}
return toolRunner;
} }
//runningBuilds //runningBuilds
/** /**
......
...@@ -106,13 +106,15 @@ public class VDTRunner { ...@@ -106,13 +106,15 @@ public class VDTRunner {
// make call it when console is closed // make call it when console is closed
private void doResumeLaunch(String consoleName ) throws CoreException { private void doResumeLaunch(String consoleName ) throws CoreException {
final VDTRunnerConfiguration runConfig=runningBuilds.resumeConfiguration(consoleName); final VDTRunnerConfiguration runConfig=runningBuilds.resumeConfiguration(consoleName);
final boolean debugPrint=VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING);
if (runConfig==null){ if (runConfig==null){
System.out.println("Turned out nothing to do. Probably a bug"); System.out.println("Turned out nothing to do. Probably a bug");
return; return;
} }
BuildParamsItem[] argumentsItemsArray = runConfig.getArgumentsItemsArray(); // uses already calculated BuildParamsItem[] argumentsItemsArray = runConfig.getArgumentsItemsArray(); // uses already calculated
int numItem=runConfig.getBuildStep(); int numItem=runConfig.getBuildStep();
System.out.println("--------- resuming "+ consoleName+", numItem="+numItem+" ------------"); if (debugPrint) System.out.println("--------- resuming "+ consoleName+", numItem="+numItem+" ------------");
ILaunch launch=runConfig.getLaunch(); ILaunch launch=runConfig.getLaunch();
IProgressMonitor monitor=runConfig.getMonitor(); IProgressMonitor monitor=runConfig.getMonitor();
for (;numItem<argumentsItemsArray.length;numItem++){ for (;numItem<argumentsItemsArray.length;numItem++){
...@@ -132,7 +134,7 @@ public class VDTRunner { ...@@ -132,7 +134,7 @@ public class VDTRunner {
} }
if (argumentsItemsArray[numItem].getNameAsParser()!=null){ if (argumentsItemsArray[numItem].getNameAsParser()!=null){
// parsers should be launched by the console scripts, in parallel to them // parsers should be launched by the console scripts, in parallel to them
System.out.println("Skipping parser "+argumentsItemsArray[numItem].getNameAsParser()); if (debugPrint) System.out.println("Skipping parser "+argumentsItemsArray[numItem].getNameAsParser());
continue; continue;
} }
// Launch the configuration - 1 unit of work // Launch the configuration - 1 unit of work
...@@ -147,8 +149,6 @@ public class VDTRunner { ...@@ -147,8 +149,6 @@ public class VDTRunner {
); );
//Andrey: if there is a single item - launch asynchronously, if more - verify queue is empty //Andrey: if there is a single item - launch asynchronously, if more - verify queue is empty
// will not change
// String consoleName=renderProcessLabel(runConfig.getToolName());
// check for cancellation // check for cancellation
if (monitor.isCanceled() || (process==null)) { if (monitor.isCanceled() || (process==null)) {
...@@ -163,17 +163,17 @@ public class VDTRunner { ...@@ -163,17 +163,17 @@ public class VDTRunner {
IOConsole iCons= (IOConsole) DebugUITools.getConsole(process); // had non-null fPatternMatcher , fType="org.eclipse.debug.ui.ProcessConsoleType" IOConsole iCons= (IOConsole) DebugUITools.getConsole(process); // had non-null fPatternMatcher , fType="org.eclipse.debug.ui.ProcessConsoleType"
if (iCons==null){ if (iCons==null){
System.out.println("Could not get a console for the specified process"); System.out.println("Could not get console for the specified process");
continue; continue;
} }
System.out.println("originalConsoleName="+consoleName+ if (debugPrint) System.out.println("originalConsoleName="+consoleName+
"\nprocessConsole name="+iCons.getName()); "\nprocessConsole name="+iCons.getName());
final IOConsole fiCons=iCons; final IOConsole fiCons=iCons;
// final String fConsoleName=fiCons.getName(); // actual console name - may be already "<terminated> ... " // final String fConsoleName=fiCons.getName(); // actual console name - may be already "<terminated> ... "
final String fConsoleName=consoleName; // calculated console name - used for launching external program final String fConsoleName=consoleName; // calculated console name - used for launching external program
// if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners // if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners
if (!fConsoleName.equals(fiCons.getName())){ // terminated before we added listeners if (!fConsoleName.equals(fiCons.getName())){ // terminated before we added listeners
System.out.println("Already terminated, proceed to the next item"); if (debugPrint) System.out.println("Already terminated, proceed to the next item");
continue; // proceed with the next item without pausing continue; // proceed with the next item without pausing
} }
/* Prepare to postpone next commands to be resumed by event*/ /* Prepare to postpone next commands to be resumed by event*/
...@@ -184,37 +184,41 @@ public class VDTRunner { ...@@ -184,37 +184,41 @@ public class VDTRunner {
public void propertyChange(PropertyChangeEvent event) { public void propertyChange(PropertyChangeEvent event) {
if (!fConsoleName.equals(fiCons.getName())){ if (!fConsoleName.equals(fiCons.getName())){
fiCons.removePropertyChangeListener(this); fiCons.removePropertyChangeListener(this);
System.out.println(">>> "+fConsoleName+" -> "+fiCons.getName()); if (debugPrint) System.out.println(">>> "+fConsoleName+" -> "+fiCons.getName());
// VDTRunner runner = VDTLaunchUtil.getRunner();
try { try {
resumeLaunch(fConsoleName); // replace with console resumeLaunch(fConsoleName); // replace with console
} catch (CoreException e) { } catch (CoreException e) {
// TODO Auto-generated catch block System.out.println ("Failed to resume launch sequence");
e.printStackTrace();
} }
} }
} }
}); });
if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners if (!fConsoleName.equals(consoleName)){ // terminated before we added listeners
System.out.println("Fire!"); if (debugPrint) System.out.println("Fire!");
iCons.firePropertyChange(fiCons,"org.eclipse.jface.text", consoleName, fConsoleName); iCons.firePropertyChange(fiCons,"org.eclipse.jface.text", consoleName, fConsoleName);
} }
System.out.println("return - waiting to be awaken"); if (debugPrint) System.out.println("return - waiting to be awaken");
int timeout=argumentsItemsArray[numItem].getTimeout(); int timeout=argumentsItemsArray[numItem].getTimeout();
if (timeout>0){ if (timeout>0){
final int fTimeout = timeout; System.out.println ("timeout is only implemented for console scripts");
final IProcess fProcess=process; // implementation will require keeping track of it and canceling if program terminated earlier.
new Timer().schedule(new TimerTask() { // And for the programs it is easy to kill them manually with a red square button
@Override if (timeout>100000) { //never with no warnings
public void run() { final int fTimeout = timeout;
System.out.println(">>Timeout<<"); final IProcess fProcess=process;
try { new Timer().schedule(new TimerTask() {
fProcess.terminate(); @Override
} catch (DebugException e) { public void run() {
System.out.println("Failed to terminate preocess on "+fConsoleName); System.out.println(">>Timeout<<");
} try {
} fProcess.terminate();
}, fTimeout*1000); } catch (DebugException e) {
System.out.println("Failed to terminate process on "+fConsoleName);
}
}
}, fTimeout*1000);
}
} }
return; return;
...@@ -397,7 +401,9 @@ public class VDTRunner { ...@@ -397,7 +401,9 @@ public class VDTRunner {
if (consoles.length>1){ if (consoles.length>1){
// ((IConsole) consoles[1]).setName("Python Consloe"); // ((IConsole) consoles[1]).setName("Python Consloe");
} }
System.out.println(consoles.length+" consoles, processes="+launch.getChildren().length); if (VerilogPlugin.getPreferenceBoolean(PreferenceStrings.DEBUG_LAUNCHING)){
System.out.println(consoles.length+" consoles, processes="+launch.getChildren().length);
}
return process; return process;
//= consoles //= consoles
//setImageDescriptor //setImageDescriptor
......
...@@ -49,6 +49,14 @@ ...@@ -49,6 +49,14 @@
icon="my_tool.gif" icon="my_tool.gif"
call="RemotePythonCommand"/> call="RemotePythonCommand"/>
<menuitem name="Vivado"
label="Run remote Vivado session"
icon="xilinx.png"
call="Vivado"/>
<menuitem name="Vivado Test"
label="Send a command to the remote Vivado session"
icon="my_tool.gif"
call="VivadoTest"/>
<menu name="XDS" <menu name="XDS"
label="Demo XDS Tools" label="Demo XDS Tools"
......
...@@ -30,9 +30,11 @@ ...@@ -30,9 +30,11 @@
<parameter id="ShellSwitches" label="Shell switches" type="String" <parameter id="ShellSwitches" label="Shell switches" type="String"
format="CopyValue" default="-c" readonly="false" visible="true" /> format="CopyValue" default="-c" readonly="false" visible="true" />
<parameter id="SSHSwitches" label="Remote ssh switches" <parameter id="TerminalMode" type="BoolYesNo" format="None"
type="String" format="CopyValue" default="" readonly="false" visible="true" /> default="false" label="Force termonal mode for remote program" />
<parameter id="SSHSwitches" label="Other ssh switches"
type="String" format="CopyValue" default="" readonly="false" visible="true" />
<parameter id="RemoteCommand" label="Remote ssh command" <parameter id="RemoteCommand" label="Remote ssh command"
type="String" format="CopyValue" default="python -i -u" readonly="false" type="String" format="CopyValue" default="python -i -u" readonly="false"
...@@ -45,6 +47,7 @@ ...@@ -45,6 +47,7 @@
<group name="General"> <group name="General">
"RemoteHost" "RemoteHost"
"RemoteUser" "RemoteUser"
"TerminalMode"
"ShellSwitches" "ShellSwitches"
"PreSSH" "PreSSH"
"SSHSwitches" "SSHSwitches"
...@@ -59,11 +62,13 @@ ...@@ -59,11 +62,13 @@
"%ShellSwitches" "%ShellSwitches"
"%PreSSH" "%PreSSH"
"ssh" "ssh"
"-t" <if TerminalMode = "true">
"-t -t"
</if>
"%SSHSwitches"
"-l" "-l"
"%RemoteUser" "%RemoteUser"
"%RemoteHost" "%RemoteHost"
"%SSHSwitches"
"'" "'"
"%RemoteCommand" "%RemoteCommand"
"'" "'"
......
<?xml version="1.0" encoding="UTF-8"?>
<vdt-project>
<interface name="VivadoInterface" extends="project_interface">
<syntax name="ProgramSyntax" format="%(%%ParamValue%|\n%)" />
</interface>
<tool name="Vivado" project="FPGA_project" label="Launch Vivado"
shell="/bin/bash" interface="VivadoInterface" description="Launching remote Xilinx Vivado in console"
errors="(.*):([0-9]+): [a-z ]*error: (.*)" warnings="(.*):([0-9]+): warning: (.*)"
info="(.*):([0-9]+): info: (.*)"> <!--does not actually exist -->
<extensions-list>
<extension mask="v" />
<extension mask="tf" />
</extensions-list>
<action-menu>
<action label="Launch Vivado" resource="" icon="xilinx.png" />
</action-menu>
<parameter id="RemoteHost" label="Remote Host IP" type="String"
format="CopyValue" default="192.168.0.122" readonly="false" visible="true" />
<parameter id="RemoteUser" label="Remote user name" type="String"
format="CopyValue" default="xilinx" readonly="false" visible="true" />
<parameter id="PreSSH" label="pre-ssh shell parameters"
type="String" format="CopyValue" default="" readonly="false" visible="true" />
<parameter id="ShellSwitches" label="Shell switches" type="String"
format="CopyValue" default="-c" readonly="false" visible="true" />
<parameter id="TerminalMode" type="BoolYesNo" format="None"
default="false" label="Force termonal mode for remote program" />
<parameter id="SSHSwitches" label="Other ssh switches"
type="String" format="CopyValue" default="" readonly="false" visible="true" />
<parameter id="RemoteCommand" label="Remote ssh command"
type="String" format="CopyValue" default="/opt/Xilinx/Vivado/2013.4/bin/vivado -mode tcl" readonly="false"
visible="true" />
<parameter id="SSHExtra" label="ssh extra parameters" type="String"
format="CopyValue" default="" readonly="false" visible="true" />
<input>
<group name="General">
"RemoteHost"
"RemoteUser"
"TerminalMode"
"ShellSwitches"
"PreSSH"
"SSHSwitches"
"RemoteCommand"
"SSHExtra"
</group>
</input>
<output>
<line name="vivado_launch"
interrupt="\x03">
"%ShellSwitches"
"%PreSSH"
"ssh"
<if TerminalMode = "true">
"-t -t"
</if>
"%SSHSwitches"
"-l"
"%RemoteUser"
"%RemoteHost"
"'"
"%RemoteCommand"
"'"
"%SSHExtra"
</line>
</output>
</tool>
<tool name="VivadoTest" project="FPGA_project" label="VivadoCommand"
shell="/bin/bash" interface="VivadoInterface"
description="Sending command to a remote Vivado session" errors="(.*):([0-9]+): [a-z ]*error: (.*)"
warnings="(.*):([0-9]+): warning: (.*)" info="(.*):([0-9]+): info: (.*)"> <!--does not actually exist -->
<extensions-list>
<extension mask="v" />
<extension mask="tf" />
</extensions-list>
<action-menu>
<action label="Vivado Command" resource="" icon="xilinx.png" />
</action-menu>
<parameter id="RemoteCommand" label="Remote Command to send"
type="Stringlist" format="ProgramSyntax" default="puts &quot;Hello, World!&quot;"
readonly="false" visible="true" />
<parameter id="vivado_console" default="Vivado"
type="String" format="CopyValue" visible="false" />
<parameter id="Timeout" label="Script timeout(sec)" type="Cardinal"
format="CopyValue" default="10" readonly="false" visible="true" />
<input>
<group name="General">
"RemoteCommand"
"Timeout"
</group>
</input>
<output>
<line name="pre_tcl">
"-c"
"echo 'scp files here' ;"
"sleep 2 ;"
</line>
<!-- TODO: Make it OK to ose just strings, not parameters in dest (for console names) -->
<line name="vivado_line_01"
dest="vivado_console"
mark="``"
sep="\n"
prompt="@@FINISH@@"
stdout="parser_001"
timeout="Timeout">
"%RemoteCommand"
"puts '@@FINISH@@'"
"``"`" <!-- two new lines should generate a pair of prompts from the remote -->
</line>
<line name="command_line_02">
"-c"
"echo 'Will scp result files back here' ;"
"sleep 2 ;"
</line>
<!-- parser_01 being referenced should be launched in an asynchronous process/console, removed from the launch sequence -->
<line name="parser_001"
errors="(.*):([0-9]+): [a-z ]*error: (.*)"
warnings="(.*):([0-9]+): warning: (.*)"
info="(.*):([0-9]+): info: (.*)">
"-c"
"cat"
</line>
</output>
</tool>
</vdt-project>
<!-- /opt/Xilinx/Vivado/2013.4/bin/vivado -mode tcl -->
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment