public static BuildResult BuildProject(string workingDirectory, string projectFilePath, string topModule) { string fusePath = XilinxHelper.GetXilinxToolPath("fuse.exe"); if (string.IsNullOrEmpty(fusePath)) { fusePath = XilinxHelper.GetXilinxToolPath("fuse"); if (string.IsNullOrEmpty(fusePath)) { throw new Exception("Unable to find the fuse Executable"); } } // Create prj file on disk string projectExecutablePath = PathHelper.Combine(workingDirectory, "x.exe"); List <string> arguments = new List <string>(); arguments.Add(string.Format("--prj \"{0}\"", projectFilePath)); //arguments.Add(string.Format("-o \"{0}\"", projectExecutablePath)); arguments.Add(topModule); ProcessHelper.ProcessExecutionResult result = XilinxProcess.ExecuteProcess(workingDirectory, fusePath, arguments); BuildResult buildResult = new BuildResult(); buildResult.BuildLog = result.StandardOutput + "\n\n\n" + result.StandardError; buildResult.WorkingDirectory = workingDirectory; buildResult.ExecutableFile = projectExecutablePath; buildResult.Built = true; return(buildResult); }
public static MemoryStream GenerateMachineCode(string workingDirectory, string asmFile) { Logger.Instance.WriteVerbose("Generating Machine code from assembly file using avr-gcc"); ProcessHelper.ProcessExecutionResult result = ProcessHelper.ExecuteProcess(workingDirectory, "avr-gcc", "-x assembler-with-cpp \"" + Path.GetFullPath(asmFile) + "\" -nostartfiles -nodefaultlibs"); if (!File.Exists(PathHelper.Combine(workingDirectory, "a.out"))) { Logger.Instance.WriteError(result.StandardError); } Logger.Instance.WriteVerbose("Generating binary output from elf"); ProcessHelper.ExecuteProcess(workingDirectory, "avr-objcopy", "-O binary a.out a.bin"); Logger.Instance.WriteVerbose("Reading in binary machine code"); MemoryStream stream = new MemoryStream(); using (FileStream reader = new FileStream(PathHelper.Combine(workingDirectory, "a.bin"), FileMode.Open, FileAccess.Read)) { int b = 0; while ((b = reader.ReadByte()) != -1) { stream.WriteByte((byte)b); } } return(stream); }
public static List <string> LoadFamilyList() { List <string> families = new List <string>(); ProcessHelper.ProcessExecutionResult result = XilinxProcess.ExecuteProcess(Environment.CurrentDirectory, "partgen", null); bool startedList = false; using (StringReader reader = new StringReader(result.StandardOutput)) { string line; while ((line = reader.ReadLine()) != null) { if (!startedList) { if (line.EndsWith("Valid architectures are:", StringComparison.InvariantCultureIgnoreCase)) { startedList = true; } } else { // Successive lines are now device families string cleanup = line.Trim(); if (!string.IsNullOrEmpty(cleanup)) { families.Add(cleanup); } } } } return(families); }
public static ProcessHelper.ProcessExecutionResult ExecuteProcess(string workingDirectory, string tool, List <string> arguments) { ProcessHelper.ProcessExecutionResult result = new ProcessHelper.ProcessExecutionResult(); using (XilinxProcess process = new XilinxProcess(tool, arguments)) { StringProcessListener listener = new StringProcessListener(); process.Listeners.Add(listener); process.WorkingDirectory = workingDirectory; process.Start(); process.WaitForExit(); result.StandardError = listener.ErrorOutput; result.StandardOutput = listener.Output; } return(result); }
public static DeviceFamily LoadFamily(DeviceManufacture manufacture, string familyName) { DeviceFamily family = null; List <string> arguments = new List <string>(); arguments.Add("-intstyle silent"); arguments.Add("-arch " + familyName); ProcessHelper.ProcessExecutionResult result = XilinxProcess.ExecuteProcess(Environment.CurrentDirectory, "partgen", arguments); bool startedList = false; string realFamilyName = familyName; string defaultSpeeds = null; Device currentDevice = null; using (StringReader reader = new StringReader(result.StandardOutput)) { string line; while ((line = reader.ReadLine()) != null) { if (!startedList) { startedList = true; realFamilyName = line.Trim(); // Picked up name family = new DeviceFamily(manufacture, realFamilyName, familyName); } else if (family != null) { // The first line i the part + speeds, lines afterwards are packages string cleanup = line.Trim(); if (line.StartsWith(" ")) { if (currentDevice != null) { // Device string[] splitUp = cleanup.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); if (splitUp.Length >= 1 && !string.IsNullOrEmpty(splitUp[0])) { // Package specifier Logger.Instance.WriteDebug("Create/Find Package '{0}'", splitUp[0]); DevicePackage partPackage = family.CreatePackage(splitUp[0]); Logger.Instance.WriteDebug("Create/Find part with package '{0}'", partPackage.Name); DevicePart part = currentDevice.CreatePart(partPackage); // Can have an exclusive set of speeds ParseSpeedDetails(family, part, (splitUp.Length > 1) ? splitUp[1] : defaultSpeeds); } } } else { string[] splitUp = cleanup.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); if (splitUp.Length >= 3 && !string.IsNullOrEmpty(splitUp[0])) { Logger.Instance.WriteDebug("Create/Find Device '{0}'", splitUp[0]); currentDevice = family.CreateDevice(splitUp[0]); defaultSpeeds = splitUp[2]; // Set default speed for devices } } } } } return(family); }
public static ProcessHelper.ProcessExecutionResult ExecuteProcess(string workingDirectory, string tool, List<string> arguments) { ProcessHelper.ProcessExecutionResult result = new ProcessHelper.ProcessExecutionResult(); using (XilinxProcess process = new XilinxProcess(tool, arguments)) { StringProcessListener listener = new StringProcessListener(); process.Listeners.Add(listener); process.WorkingDirectory = workingDirectory; process.Start(); process.WaitForExit(); result.StandardError = listener.ErrorOutput; result.StandardOutput = listener.Output; } return result; }