diff --git a/src/Qir/Controller/Controller.cs b/src/Qir/Controller/Controller.cs index 2e6593dde35..1ae7e6a747c 100644 --- a/src/Qir/Controller/Controller.cs +++ b/src/Qir/Controller/Controller.cs @@ -7,9 +7,9 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.Quantum.Qir.Model; +using Microsoft.Quantum.Qir.Serialization; using Microsoft.Quantum.Qir.Tools.Executable; using Microsoft.Quantum.Qir.Utility; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; namespace Microsoft.Quantum.Qir { diff --git a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirDriverGeneratorTests.cs b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirDriverGeneratorTests.cs index 92d8daaa744..03a0859093e 100644 --- a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirDriverGeneratorTests.cs +++ b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirDriverGeneratorTests.cs @@ -8,7 +8,7 @@ using Xunit; using Microsoft.Quantum.Qir.Tools.Driver; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Tests.Microsoft.Quantum.Qir.Tools { diff --git a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirExecutableTests.cs b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirExecutableTests.cs index a47b4023b68..8c3b469c2a5 100644 --- a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirExecutableTests.cs +++ b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/QirExecutableTests.cs @@ -5,10 +5,10 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Serialization; using Microsoft.Quantum.Qir.Tools.Driver; using Microsoft.Quantum.Qir.Tools.Executable; using Microsoft.Quantum.Qir.Utility; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; using Moq; using Xunit; diff --git a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/Util.cs b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/Util.cs index ab6aee7d8eb..e027bbe5403 100644 --- a/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/Util.cs +++ b/src/Qir/Execution/Tests.Microsoft.Quantum.Qir.Tools/Util.cs @@ -2,8 +2,6 @@ // Licensed under the MIT License. using System.IO; -using System.Reflection; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; namespace Tests.Microsoft.Quantum.Qir.Tools { diff --git a/src/Qir/Execution/Tools/Driver/IQirDriverGenerator.cs b/src/Qir/Execution/Tools/Driver/IQirDriverGenerator.cs index 28c3ef5fc90..8f29518aca3 100644 --- a/src/Qir/Execution/Tools/Driver/IQirDriverGenerator.cs +++ b/src/Qir/Execution/Tools/Driver/IQirDriverGenerator.cs @@ -3,7 +3,7 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Microsoft.Quantum.Qir.Tools.Driver { diff --git a/src/Qir/Execution/Tools/Driver/QirCppDriver.cs b/src/Qir/Execution/Tools/Driver/QirCppDriver.cs index 807f959095b..c1eb3cec1d3 100644 --- a/src/Qir/Execution/Tools/Driver/QirCppDriver.cs +++ b/src/Qir/Execution/Tools/Driver/QirCppDriver.cs @@ -10,7 +10,7 @@ namespace Microsoft.Quantum.Qir.Tools.Driver { using System.IO; - using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; + using Microsoft.Quantum.Qir.Serialization; using System; /// diff --git a/src/Qir/Execution/Tools/Driver/QirCppDriverEx.cs b/src/Qir/Execution/Tools/Driver/QirCppDriverEx.cs index 7c05fba2b3e..b66eca09a57 100644 --- a/src/Qir/Execution/Tools/Driver/QirCppDriverEx.cs +++ b/src/Qir/Execution/Tools/Driver/QirCppDriverEx.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Microsoft.Quantum.Qir.Tools.Driver { diff --git a/src/Qir/Execution/Tools/Driver/QirCppDriverGenerator.cs b/src/Qir/Execution/Tools/Driver/QirCppDriverGenerator.cs index a9a8233464b..26db40b0c90 100644 --- a/src/Qir/Execution/Tools/Driver/QirCppDriverGenerator.cs +++ b/src/Qir/Execution/Tools/Driver/QirCppDriverGenerator.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Microsoft.Quantum.Qir.Tools.Driver { diff --git a/src/Qir/Execution/Tools/Driver/QirCppInterop.cs b/src/Qir/Execution/Tools/Driver/QirCppInterop.cs index b4da38b9676..dfac2fac833 100644 --- a/src/Qir/Execution/Tools/Driver/QirCppInterop.cs +++ b/src/Qir/Execution/Tools/Driver/QirCppInterop.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; #nullable enable diff --git a/src/Qir/Execution/Tools/Driver/QirFullStateDriverGenerator.cs b/src/Qir/Execution/Tools/Driver/QirFullStateDriverGenerator.cs index 8f98b4a80f9..381a06b532f 100644 --- a/src/Qir/Execution/Tools/Driver/QirFullStateDriverGenerator.cs +++ b/src/Qir/Execution/Tools/Driver/QirFullStateDriverGenerator.cs @@ -3,8 +3,7 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.Quantum.QsCompiler; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Microsoft.Quantum.Qir.Tools.Driver { diff --git a/src/Qir/Execution/Tools/Executable/IQirExecutable.cs b/src/Qir/Execution/Tools/Executable/IQirExecutable.cs index 765207e3c99..477dd2cfe2a 100644 --- a/src/Qir/Execution/Tools/Executable/IQirExecutable.cs +++ b/src/Qir/Execution/Tools/Executable/IQirExecutable.cs @@ -3,7 +3,7 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; +using Microsoft.Quantum.Qir.Serialization; namespace Microsoft.Quantum.Qir.Tools.Executable { diff --git a/src/Qir/Execution/Tools/Executable/QirExecutable.cs b/src/Qir/Execution/Tools/Executable/QirExecutable.cs index a1613c41773..4c6f73c7d2d 100644 --- a/src/Qir/Execution/Tools/Executable/QirExecutable.cs +++ b/src/Qir/Execution/Tools/Executable/QirExecutable.cs @@ -4,9 +4,9 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Quantum.Qir.Serialization; using Microsoft.Quantum.Qir.Tools.Driver; using Microsoft.Quantum.Qir.Utility; -using Microsoft.Quantum.QsCompiler.BondSchemas.Execution; namespace Microsoft.Quantum.Qir.Tools.Executable { diff --git a/src/Qir/Execution/Tools/Microsoft.Quantum.Qir.Tools.csproj b/src/Qir/Execution/Tools/Microsoft.Quantum.Qir.Tools.csproj index 77ceccafb92..8917f61f09e 100644 --- a/src/Qir/Execution/Tools/Microsoft.Quantum.Qir.Tools.csproj +++ b/src/Qir/Execution/Tools/Microsoft.Quantum.Qir.Tools.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Qir/Execution/Tools/QirTools.cs b/src/Qir/Execution/Tools/QirTools.cs index 08531a54057..e430ce5501b 100644 --- a/src/Qir/Execution/Tools/QirTools.cs +++ b/src/Qir/Execution/Tools/QirTools.cs @@ -1,8 +1,12 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using Microsoft.Quantum.Qir.Tools.Executable; +using Microsoft.Quantum.QsCompiler; +using Microsoft.Quantum.QsCompiler.QIR; using System; using System.IO; +using System.Linq; using System.Threading.Tasks; namespace Microsoft.Quantum.Qir.Tools @@ -12,16 +16,40 @@ namespace Microsoft.Quantum.Qir.Tools /// public static class QirTools { - /// /// Creates a QIR-based executable from a .NET DLL generated by the Q# compiler. /// /// .NET DLL generated by the Q# compiler. /// Directory where the libraries to link to are located. /// Directory where the headers needed for compilation are located. - public static Task BuildFromQSharpDll(FileInfo qsharpDll, DirectoryInfo libraryDirectory, DirectoryInfo includeDirectory) + /// Directory where the created executables are placed. + public static async Task BuildFromQSharpDll( + FileInfo qsharpDll, + DirectoryInfo libraryDirectory, + DirectoryInfo includeDirectory, + DirectoryInfo executablesDirectory) { - throw new NotImplementedException(); + using var qirContentStream = new MemoryStream(); + if (!AssemblyLoader.LoadQirByteCode(qsharpDll, qirContentStream)) + { + throw new ArgumentException("The given DLL does not contain QIR byte code."); + } + + if (!executablesDirectory.Exists) + { + executablesDirectory.Create(); + } + + var tasks = EntryPointOperationLoader.LoadEntryPointOperations(qsharpDll).Select(entryPointOp => + { + var exeFileInfo = new FileInfo(Path.Combine(executablesDirectory.FullName, entryPointOp.Name)); + var exe = new QirFullStateExecutable(exeFileInfo, qirContentStream.ToArray()); + return exe.BuildAsync(entryPointOp, libraryDirectory, includeDirectory); + }); + + await Task.WhenAll(tasks); + + // ToDo: Return list of created file names } } }